$ watch在父控制器和嵌套控制器中的binded变量

时间:2017-11-16 20:41:49

标签: javascript angularjs

我对$ watch和嵌套控制器中的范围有疑问。

我有一个带有ng-model的输入。例如,在我的HTML

    <input ng-model='searchString' />  

这是在子(嵌套)控制器内,但我在父控制器中定义了ng-model。所以我试着在家长控制器上观看。它没有用。

    app.controller('mainCtrl', ['$scope', function($scope){
        $scope.searchString = '';
        $scope.$watch('searchString', function(){
            console.log("changed in parent");
        })
    }]);
    app.controller("nestedCtrl", ["$scope", function($scope){        
    }])

但是,如果我将$ watch放在子控制器中,它就能工作。

    app.controller("nestedCtrl", ["$scope", function($scope){ 
        $scope.$watch('searchString', function(){
            console.log("changed in child");
        })
    }])

为什么我在父控制器中定义范围但只能在子控制器中监视? 任何方式都可以让父控制器检测到这些变化?因为我需要用子控制器做一些事情但是基于这个范围变量,但是我无法做到。

2 个答案:

答案 0 :(得分:0)

最快最肮脏的将是:

您可以向父$scope添加方法,然后通过$scope.$parent.method()从子监视器中调用它。

但这不是一个好方法。你应该避免这种情况。通常要解决此类问题,您应该创建服务并将其注入子控制器和父控制器并通过它进行通信。

答案 1 :(得分:0)

这是因为AngularJS子范围从父项复制原始元素,并引用从Objects继承的元素。因此,子范围在开头有一个searchString的副本。

以下是一个示例:https://jsfiddle.net/NitroInside/p85he1du

详细说明如下:https://github.com/angular/angular.js/wiki/Understanding-Scopes