Javascript 如何更改angularJS中的观察者顺序?
我已经编写了一个具有本地范围的控制器和指令。 我在postLink方法中对scope变量设置了watcher,并为更改变量添加了$interval,同时在控制器中对绑定变量添加了watcherJavascript 如何更改angularJS中的观察者顺序?,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我已经编写了一个具有本地范围的控制器和指令。 我在postLink方法中对scope变量设置了watcher,并为更改变量添加了$interval,同时在控制器中对绑定变量添加了watcher console.clear(); var myApp = angular.module('myApp', []); myApp.controller('MainCtrl', ['$scope', function($scope) { $scope.$watch(function()
console.clear();
var myApp = angular.module('myApp', []);
myApp.controller('MainCtrl', ['$scope',
function($scope) {
$scope.$watch(function() {
return $scope.ctrlVar;
}, function(newValue) {
console.log('WATCHER TWO: newValue = ', newValue);
}, true);
}
]);
myApp.directive('testDirective',
['$interval', function($interval) {
return {
scope: {
date: '=dateModel'
},
template: "<input type='text' value='{{date}}' />",
restrict: 'E',
link: function postLink(scope, element) {
console.log('link');
var i = 1;
$interval(function() {
scope.date = i++;
}, 1000);
scope.$watch('date', function(){
console.log('WATCHER ONE: newValue = ', scope.date);
});
}
};
}]
);
我注意到,在$interval中更改newValue时,首先调用指令中的watchlistener。在我的产品代码中(我没有发布代码,因为它有点复杂,我创建了plunk,观察者的行为是不同的)
你知道如何管理手表听众的订单吗?可能吗
下面是一个例子我同意@DRobinson的观点,但如果您必须更改观察者的顺序,您可以使用超时设置观察者的某种“优先级”。我不知道有什么办法可以在他们注册后改变他们,但是你可以推迟注册
myApp.controller('MainCtrl', ['$scope', '$timeout', function ($scope, $timeout) {
$timeout(function () {
$scope.$watch(function () {
return $scope.ctrlVar;
}, function (newValue) {
console.log('WATCHER TWO: newValue = ', newValue);
}, true);
}, 10);
}]);
这是一把小提琴,显示了第一次观察者一次之后,观察者两次开火 请在问题中张贴实际代码。这个问题应该独立存在,而不依赖外部因素links@NewDev好的,我已经补充说,如果生产中的行为与演示不同,演示将如何帮助我们理解您的问题?另外,手表产生的实际问题是什么?看看选项
priority
我认为如果这是一个问题,那么您需要重新考虑您的解决方案。观察者发出的命令不应引起问题;如果这种竞争条件导致了问题,那么很可能意味着您的业务逻辑过于分散,过于脆弱。
WATCHER IN CONTROLLER: newValue = undefined
script.js:32 WATCHER IN DIRECTIVE: newValue = undefined
script.js:32 WATCHER IN DIRECTIVE: newValue = 1
script.js:10 WATCHER IN CONTROLLER: newValue = 1
script.js:32 WATCHER IN DIRECTIVE: newValue = 2
script.js:10 WATCHER IN CONTROLLER: newValue = 2
myApp.controller('MainCtrl', ['$scope', '$timeout', function ($scope, $timeout) {
$timeout(function () {
$scope.$watch(function () {
return $scope.ctrlVar;
}, function (newValue) {
console.log('WATCHER TWO: newValue = ', newValue);
}, true);
}, 10);
}]);