14

我在表单上使用 ng-submit 将数据推送到 Firebase,一切都按预期工作。我想做的是同时改变观点。在提交按钮本身上,我设置了 ng-click 以使用 $location 执行函数。如果我将 changeView 函数放在 .controller 方法中,我将无法使用 $location(具体来说,它说 - “错误:'undefined' 不是对象(评估 '$location.path')”)。任何帮助都是超级骗子。

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

}

这是我的模板:

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

3 回答 3

36

您没有将$location对象注入控制器。它列在您的函数参数中,但您忘记在所述函数之前将其添加到列表中。

myApp.controller('CtrlName', ['$scope', 'angularFireCollection','$location',
    function($scope, angularFireCollection, $location) {
        ...
    }]);
于 2013-09-06T20:53:24.897 回答
4

另外不要忘记将 $location 添加到您的操作中:

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

        });
    };
}]);
于 2014-06-08T08:31:58.600 回答
1

天哪,我不敢相信我曾经这样做过。#捂脸。这是重定向表单提交的正确方法。

模板

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

控制器

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

  };

  }
);

显着变化:

  1. 我没有为我的 DI 使用注释,我将其卸载到 ng-annotate,然后缓解任何问题,例如我最初问这个问题时遇到的问题。
  2. 我正在使用这个问题时不存在的“控制器作为”语法。
  3. 我不再通过尝试在两个单独的函数中对可能的一个事件执行两个单独的操作来创建一些奇怪的竞争条件。Promise 是此类操作的完美解决方案。
于 2013-09-06T21:30:32.400 回答