webentwicklung-frage-antwort-db.com.de

Auf $ location kann nicht zugegriffen werden, wenn die .controller-Methode in AngularJS verwendet wird

Ich benutze ng-submit für ein Formular, um Daten in eine Firebase zu pushen. Alles funktioniert wie erwartet. Was ich gerne machen würde, ist, gleichzeitig die Ansichten zu ändern. Auf dem Submit-Button selbst habe ich ng-click gesetzt, um eine Funktion mit $ location auszuführen. Wenn ich meine changeView-Funktion in einer .controller-Methode platziere, kann ich $ location nicht verwenden (insbesondere heißt es: "Fehler: 'undefined' ist kein Objekt (wertet '$ location.path' aus)"). Jede Hilfe wäre super 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);
    }

}

Hier ist meine Vorlage:

<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>
14
Scott Sword

Sie fügen das $location-Objekt nicht in Ihren Controller ein. Es ist in Ihren Funktionsparametern aufgeführt, aber Sie haben vergessen, es der Liste vor der genannten Funktion hinzuzufügen.

myApp.controller('CtrlName', ['$scope', 'angularFireCollection','$location',
    function($scope, angularFireCollection, $location) {
        ...
    }]);
36
m.e.conroy

Vergessen Sie nicht, $ location in Ihre Aktion einzufügen:

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

        });
    };
}]);
4
Vadim

Heilige Kuh Ich kann nicht glauben, dass ich das je gemacht habe. #Facepalm. Dies ist der richtige Weg, um eine Formularübergabe umzuleiten.

Vorlage

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

Controller  

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

  };

  }
);

Bemerkenswerte Änderungen:

  1. Ich verwende keine Anmerkungen für mein DI, ich entlade dies zu ng-annotate, was dann alle Probleme mildert, die mir zum Beispiel bei der ursprünglichen Frage gestellt wurden.
  2. Ich verwende 'Controller as' Syntax, die zum Zeitpunkt dieser Frage nicht existierte.
  3. Ich erstelle keine sonderbaren Racebedingung mehr, indem ich versuche, zwei separate Aktionen in zwei separaten Funktionen für möglicherweise ein Event auszuführen. Versprechen sind eine perfekte Lösung für diese Art von Aktion.
1
Scott Sword