2013-09-06 77 views
14

Tôi đang sử dụng ng-submit trên biểu mẫu để đẩy dữ liệu vào Firebase, mọi thứ hoạt động như mong đợi. Những gì tôi muốn làm là thay đổi quan điểm cùng một lúc. Trên chính nút gửi, tôi có ng-click được thiết lập để thực thi một hàm bằng cách sử dụng $ location. Nếu tôi đặt hàm changeView của tôi trong một phương thức .controller, tôi không thể sử dụng $ location (cụ thể, nó nói - "Error: 'undefined' không phải là một đối tượng (đánh giá '$ location.path')"). Bất kỳ sự trợ giúp nào sẽ là siêu duper.

// This doesn't work and throws the error 
myApp.controller('CtrlName', ['$scope', 'angularFireCollection', 
    function($scope, angularFireCollection, $location) { 

     $scope.changeView = function(view) { 
      $location.path(view); 
     } 

    } 
]); 



// This works as expected, but I'm name spacing my functions globally and I will have to change how I'm accessing my Firebase, which isn't really desired. 
function CtrlName($scope, angularFireCollection, $location) { 

    $scope.changeView = function(view) { 
     $location.path(view); 
    } 

} 

Đây là mẫu của tôi:

<form role="form" ng-submit="tactics.add(tactic)"> 
    <div class="form-group"> 
     <label>Select Method</label> 
      <select class="form-control" ng-model="tactic.type"> 
       <option>Email</option> 
       <option>Display</option> 
      <option>SMS</option> 
      <option>Print</option> 
     </select> 
    </div> 
    <button type="submit" class="btn btn-success" ng-click="changeView('/my-tactics')">Save</button> 
</form> 
+0

Nhìn vào bài này hai năm sau, tôi không thể tin rằng tôi đã làm điều này. Đối với bất kỳ ai thu thập thông tin SO, đừng làm điều này. Đây là những gì hứa hẹn cho. Những gì tôi cần phải làm là bắn một chức năng điều khiển dữ liệu và sau khi hoàn thành thì thực hiện chuyển hướng thích hợp. Điều này có thể được thực hiện với $ http, $ q hoặc thậm chí là $ save của Firebase(). – Swordfish0321

Trả lời

35

Bạn không tiêm đối tượng $location vào điều khiển của bạn. Nó được liệt kê trong các tham số chức năng của bạn nhưng bạn quên thêm nó vào danh sách trước khi nói chức năng.

myApp.controller('CtrlName', ['$scope', 'angularFireCollection','$location', 
    function($scope, angularFireCollection, $location) { 
     ... 
    }]); 
+0

Dude, tôi thề tôi đã thử điều đó, nhưng bây giờ nó đang hoạt động. Cảm ơn. Mặc dù điều này hiện đang giết chết hình thức gửi của tôi. Câu trả lời của bạn là chính xác vì vậy tôi sẽ đánh dấu như vậy, nhưng tôi nghĩ cách tốt nhất để thực hiện điều này là để có được từ hai sự kiện riêng biệt. Tái cấu trúc ... – Swordfish0321

+1

Vui vì tôi có thể giúp. Vấn đề khác của bạn có thể được quy cho bạn bằng cách sử dụng 'ng-submit' trong thẻ biểu mẫu của bạn nhưng' ng-click' trong nút gửi đang "ưu tiên" vì nó thực sự thay đổi đường dẫn URL của bạn. Nó có thể không được ưu tiên nhưng nó chắc chắn thay đổi URL/xem của bạn trước hoặc ngay sau khi gửi biểu mẫu của bạn. –

1

Tôi không thể tin rằng tôi đã từng làm việc này. #Facepalm. Đây là cách thích hợp để chuyển hướng trên một biểu mẫu gửi.

Template

<form role="form" ng-submit="vm.submit(tactic)"> 
    <div class="form-group"> 
     <label>Select Method</label> 
      <select class="form-control" ng-model="tactic.type"> 
       <option>Email</option> 
       <option>Display</option> 
      <option>SMS</option> 
      <option>Print</option> 
     </select> 
    </div> 
    <button type="submit" class="btn btn-success">Save</button> 
</form> 

khiển

angular.module('MyApp') 
    .controller('CtrlName', function($scope, $location, $log, angularFireCollection, tactics) { 

    var vm = this; 

    vm.submit = function submit(item) { 

    tactics.add(item) 
     .then(function(rsp) { 
     $log.debug('Attempted to add tactic to Firebase', rsp); 
     $location.path('/my-tactics'); 
     }); 

    }; 

    } 
); 

Những thay đổi đáng chú ý:

  1. tôi không sử dụng các chú thích cho DI tôi, tôi offl oad này để ng-chú thích, mà sau đó giảm nhẹ bất kỳ vấn đề như một trong tôi chạy vào khi ban đầu yêu cầu câu hỏi này.
  2. Tôi đang sử dụng cú pháp 'điều khiển dưới dạng' không tồn tại tại thời điểm câu hỏi này.
  3. Tôi không còn tạo ra một số điều kiện đua kỳ lạ bằng cách cố gắng thực hiện hai hành động riêng biệt trong hai chức năng riêng biệt trên một sự kiện có thể. Lời hứa là một giải pháp hoàn hảo cho loại hành động này.
4

Cũng đừng quên để thêm $ vị trí vào hành động của bạn:

authControllers.controller('AuthRegisterCtrl', ['$scope', '$http', '$location', 

function ($scope, $http, $location) { 

    $scope.master = {}; 

    $scope.save = function (user) { 
     $scope.master = angular.copy(user); 
     $http({ 
      method: 'POST', 
      url: '/angular/auth/register', 
      data: user 
     }).success(function (d) { 
      $location.path('/login'); 

     }); 
    }; 
}]); 
+0

Lưu ý: Hãy chắc chắn thêm '$ location' vào dòng đầu tiên và $ location trên dòng thứ ba. Đã dành khoảng 15 phút vì tôi đã bỏ lỡ nó trên dòng thứ ba: chức năng ($ scope, $ http, $ location) { – PCPGMR