2013-09-06 24 views
14

içinde .controller yöntemini kullanırken $ konumuna erişemiyor Verileri bir Firebase'e itmek için formda ng-submit kullanıyorum, her şey beklendiği gibi çalışıyor. Benim yapmak istediğim, aynı zamanda görünümleri değiştirmek. Gönder düğmesinin kendisinde $ konumu kullanarak bir işlevi yürütmek için ng-tıklama ayarım var. ChangeView işlevimi bir .controller yöntemine yerleştirirsem, $ konumu kullanamıyorum (özellikle, diyor - "Error: 'undefined" bir nesne değil (' $ location.path 'değerlendirmesini yapıyor) "). Herhangi bir yardım süper duper olur.AngularJS

<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

iki yıl sonra bunu yaptığıma inanamıyorum bu yazı bakarak. SO tarayan herkes için, bunu yapma. Bunun için vaatler budur. Yapmam gereken şey, verileri manipüle eden ve tamamlandıktan sonra uygun yönlendirmeyi gerçekleştiren bir işlevi ateşlemekti. Bu, $ http, $ q veya Firebase'in $ save() ile yapılabilir. – Swordfish0321

cevap

35

Sen denetleyici içine $location nesneyi enjekte değiliz:

// 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); 
    } 

} 

İşte benim şablondur. İşlev parametrelerinizde listelenir, ancak bu işlevden önce listeye eklemeyi unutmuşsunuzdur.

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

Dostum, yemin ederim bunu denedim ama şimdi çalışıyor. Teşekkürler. Bu şimdi benim formumu öldürmekle birlikte. Cevabınız doğru, ben de böyle işaretleyeceğim, ama bunu yapmanın en iyi yolunun iki ayrı olaya sahip olmaktan kurtulmak olduğunu düşünüyorum. Refactoring ... – Swordfish0321

+1

Sevindim. Diğer probleminiz form etiketinizde 'ng-submit' kullanılarak size atfedilebilir, ancak gönderim düğmesindeki' ng-click 'URL yolunu gerçekten değiştirdiğinden "öncelik" alır. Önceliği olmayabilir, ancak URL'nizi/formunuzu, formunuz gönderildikten hemen önce veya sonra değiştirerek kesinlikle değiştirebilir. –

1

Kutsal İnek Bunu yaptığımı hiç sanmıyorum. #Facepalm. Bir form gönderiminde yeniden yönlendirmenin uygun yolu.

Şablon

<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> 

Kontrolör

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'); 
     }); 

    }; 

    } 
); 

Önemli Değişiklikler: Ben DI ek açıklamaları kullanarak değilim

  1. , ben offl Bunu ng-annotate'a bırakın, daha sonra bu soruyu orijinal olarak sorduğumda olduğu gibi herhangi bir sorunu hafifletir.
  2. Bu soruda mevcut olmayan 'controller as' sözdizimini kullanıyorum.
  3. İki farklı eylemde iki ayrı eylemi gerçekleştirmeye çalışarak, muhtemelen bir olayla ilgili bazı garip yarış koşulları oluşturmuyorum. Sözler bu tür eylemler için mükemmel bir çözümdür.
4

Ayrıca eyleme $ konumu eklemek için unutma:

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

Not: İlk satıra '$ location' ve üçüncü satıra $ konum eklediğinizden emin olun. Yaklaşık 15 dakika geçirdim çünkü üçüncü satırda kaçırdım: işlevi ($ kapsam, $ http, $ location) { – PCPGMR