AngularJS - 触发$ watch / $ observe侦听器

时间:2015-07-13 07:59:05

标签: javascript angularjs angularjs-scope

我想发射所有$ watch / $ observe侦听器,即使观察/观察值没有变化。通过这种方式,我可以提供仅仅测试"无需用户交互即可刷新当前页面/视图的功能。我曾尝试拨打$ apply / $ digest,但这并没有奏效:

$timeout(function(){
    $scope.$apply();
});

$timeout(function(){
    $scope.$digest();
});

还有其他办法吗?

最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

执行$scope.$apply()将触发摘要周期,因为它在内部调用$digest,下面是手动更改的示例。

number变量不会受到约束,因为超时会使其超出角度范围。

setTimeout(function () { 
    $scope.number = Math.random(); 
});

然而,您可以通过手动应用范围更改来“强制”显示它:

setInterval(function () {
    $scope.$apply(); 
}, 100);

<强>演示: No change / Change with manual updates

但这不会触发观察者。从$digest实现开始,它会检查自上次手表评估后值是否已更改,并且只有在执行回调时才会运行回调。

  

if((value = watch.get(current))!==(last = watch.last)... [rootScope.js]

因此,您需要以某种方式更改上次执行的值,并且可以通过范围内的$$watchers对象进行操作:

$scope.digest = function () {
    setTimeout(function () {
        angular.forEach($scope.$$watchers, function (w) {
            w.last.value = Math.random();
        });

        $scope.$apply();
    });
}

<强> DEMO

答案 1 :(得分:0)

如何使用line_items_for_removal = [5,6,7,8] #list of category ids to search through item = Item.find(1) line_items_for_removal.each do |line_item| item.line_items.select{|x| x.category_id == line_item nil}.each{|x| item.destroy} end 函数然后使用$emit函数捕获该事件?

$on事件函数调用中,事件从子范围冒泡到父范围。触发事件的范围之上的所有范围都将收到有关该事件的通知。 当我们想要将应用程序内的状态更改传达给应用程序的其余部分时,我们会使用$emit()

$emit()

然后在捕获阶段:

_.bind($scope.$emit, $scope, 'myCustomEvent');