嵌套回调中$ scope。$ apply()的问题

时间:2015-08-27 21:26:38

标签: angularjs angularjs-scope

对Angular很新,并尝试在范围之外进行更改时学习角度消化的最佳方法。如果这个问题有更好的标题,请告诉我。      我对在范围之外变化的对象有了相当多的运气,但对于在范围之外创建的对象却没有。以下示例。我可以注册$scope.sc.conversationManageger.conversations.added(conversation)上的更改,并在回调中使用$scope.$apply();并按预期(或我预期)更新绑定。但是在该回调中,我注册到从前一个回调传递的conversation.chatService.state.changed对象上的另一个事件conversation。在第二次回调中,我确实要触发事件并且可以使用console.log(change)进行确认,但是我在第二次回调中的if (!$scope.$$phase) {$scope.$apply();}似乎没有像在原始回调上那样更新绑定。我尝试了三种不同的方法,如下面的代码所示,但它们似乎都不起作用。如果我从 ng-click 事件中呼叫$scope.verify(),但它更新时没有任何问题。

$scope.sc = new Skype.Web.Model.Application;

$scope.sc.conversationsManager.conversations.added(function (conversation) {
    if (!$scope.$$phase) {
        //This Apply updates the objects as expected
        $scope.$apply();   

        conversation.chatService.state.changed(function (change) {
                //I do get the output in the console as expected so event does fire
                console.log(change)
                //Attempt 1, current Scope Apply doesnt update $scope.sc object
                if (!$scope.$$phase) {$scope.$apply();}
                //Attempt 2, Getting scope from ref doesnt update $scope.sc object
                var scopeRef = angular.element($("#scopeAnchor")).scope();
                if (!scopeRef.$$phase) { scopeRef.$apply(); }
                // Attempt 3, calling verify function which worked when called from ng-click
                //  but not from here
                $scope.verify();
            });        
    }
});

//Executing this function does update everything as expected
$scope.verify = function () {
    // console.log($scope.sc);
    if (!$scope.$$phase) { $scope.$apply() }
}

再次感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我最终能够通过使用$scope.$apply()在回调中广播事件然后使用

来触发$rootScope.$broadcast('skypeChange');
$scope.$on('skypeChange', function (event) {
            if (!$scope.$$phase) { $scope.$apply() }
        });

触发申请。希望这可以帮助任何有同样问题的人。