我对$ 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");
})
}])
为什么我在父控制器中定义范围但只能在子控制器中监视? 任何方式都可以让父控制器检测到这些变化?因为我需要用子控制器做一些事情但是基于这个范围变量,但是我无法做到。
答案 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