AngularJS推送未定义

时间:2014-01-18 14:24:18

标签: angularjs angularjs-scope

  

无法调用未定义的方法'push'

当我的AngularJS运行以下内容时收到该错误:

$scope.ok = function () {
    $modalInstance.close();
    $scope.key.push({ title: '', gps:'', desc:''});
};

我在$scope.key = [];之后立即声明我的.controller因为我需要能够在应用程序的其他部分使用$scope.key。有人可以指出我应该在哪里宣布这个吗?

$scope.ok是我的保存按钮,它从我的输入字段中提取数据,而我$scope.plotmarkers用于从已推送的输入中提取数据。

app.controller('MenuSideController', ['$scope','$modal','$log', function($scope, $modal, $log) {

    $scope.key = [];

    $scope.createmarker = function () {
        var modalInstance = $modal.open({
            templateUrl: 'template/modal-add-marker.html',
            controller: ModalInstanceCtrl,
            resolve: {}
        });
        modalInstance.result.then(function (selectedItem) {
        }, function () {
            $log.info('Modal dismissed at: ' + new Date());
        });
    };
    var ModalInstanceCtrl = function ($scope, $modalInstance) {
        $scope.ok = function () {
            $modalInstance.close();
            $scope.key.push({ title: '', gps:'', desc:''});
        };

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    };


    $scope.plotmarkers = function() {
        console.log($scope.key);
    };
}]);

2 个答案:

答案 0 :(得分:0)

不要忘记将范围传递给$modal.open!如果不这样做,它将默认为根范围,它不是控制器范围的子节点,因此未在其上或其父节点上定义key。您可以使用{ scope: $scope.$new(), ... }作为$model.open的参数来将其传递给控制器​​范围的子节点。有关详细信息,请参阅the docs。祝你好运!

答案 1 :(得分:-1)

我认为你使用$ modal有点不合适。

所以你在这里有两个控制器 - 一个用于应用程序逻辑,一个用于模态窗口本身。根据最佳实践,您不应该直接在不同控制器之间进行交互(父子指令的情况是排除的,但老实说它不是直接交互 - 而是您的链接器函数使用来自父指令的控制器)。我们应该使用服务而不是控制器之间的交互。这只是附加说明。

与您的问题有什么关系 - 您有两件事要记住:

  • 如果要将信息从控制器传递到模态窗口,则应使用resolve属性,该属性实际指定了多个函数,这些函数被调用以获取数据,然后作为函数参数注入模态窗口控制器。这样您就可以从主控制器传递一些数据。
  • 如果你需要传回结果,你应该使用模态实例的结果属性,这是承诺(通过使用你的$ modalInstance.result.then(function(result){...});)传递这个来自模态的对象你可以用结果作为参数关闭它:$ modalInstance.close(result);

希望这会有所帮助。有关详细信息,请查看$ modal的文档:Angular Bootstrap