Angularjs Pass形式,它是模态控制器内部的ng-controller外模态

时间:2015-01-18 22:08:09

标签: javascript angularjs twitter-bootstrap angular-ui-bootstrap

所以我对为什么这不起作用感到有点困惑:

我的主要Angular页面有一个名为" SearchCtrl"它包含一堆用于将搜索发送到网络服务器的逻辑。

app.controller('SearchCtrl', ['$http','$scope', function($http,$scope) {

$scope.doAlert = function() {
    console.log('search page alert inside searchresultsctrl');
}

这个控制器包含在我的搜索页面上,然后在页面的某个地方有另一个控制器SearchSortModalCtrl,它将弹出一个模态并让用户做一些事情:

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

var modalInstance = $modal.open({
        templateUrl: '/modal-search-sort.html',
        controller: 'SearchSortFormCtrl',
        size: size,
        resolve: {
            items: function () {
              return $scope.items;
            }
        }
    });

它连接到此控制器:

app.controller('SearchSortFormCtrl', ['$http','$scope','$rootScope','$modalInstance', function($http,$scope,$rootScope,$modalInstance) {

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

    $scope.doAlert2 = function() {
        console.log('search page alert test2');
    }

所以,无论如何,我要做的是在模态表单中放置一个ng-submit,当提交该表单时,它将在SearchCtrl上做一些逻辑。

但如果我这样做

ng-submit="doAlert()"

在我的模态中,它将无法工作或向SearchCtrl发送任何内容,但如果我将其更改为doAlert2(),它当然会在SearchSortFormCtrl上运行。我试过制作它

ng-submit="$parent.doAlert()"

但没有骰子,并告诉你我甚至尝试过什么级别的fla <

ng-submit="$parent.$parent.doAlert()"

并且没有做任何事。

我做错了什么,或者如何让这个表单只是在SearchCtrl中做些什么?

1 个答案:

答案 0 :(得分:1)

由于您的控制器是SearchCtrl的子控制器,因此其任何后代(隔离的作用域指令除外)将自动继承doAlert个函数。在你的情况下,你没有在模态设置中使用scope选项,因此模态范围最终将是角度ui模态所做的$rootScope。您可以在控制器的设置中提供范围选项。所以:

设置scope:$scope或者如果您不想污染当前控制器范围,并使用模态控制器设置的属性设置childscope,即scope:$scope.$new()

var modalInstance = $modal.open({
    templateUrl: '/modal-search-sort.html',
    controller: 'SearchSortFormCtrl',
    size: size,
    scope: $scope, //Or $scope.$new()
    resolve: {
        items: function () {
          return $scope.items;
        }
    }
});

Documentation link

  

范围 - 用于模态内容的范围实例(实际上,$ modal服务将创建提供范围的子范围)。默认为$ rootScope