Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何更改angularJS中的观察者顺序?_Javascript_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript 如何更改angularJS中的观察者顺序?

Javascript 如何更改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()

我已经编写了一个具有本地范围的控制器和指令。 我在postLink方法中对scope变量设置了watcher,并为更改变量添加了$interval,同时在控制器中对绑定变量添加了watcher

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);

}]);