Javascript 更改$scope变量而不更新视图

Javascript 更改$scope变量而不更新视图,javascript,angularjs,Javascript,Angularjs,我有一个基于特定条件发布某些事件的服务。此代码不起作用: $scope.$on('INTEREST_RECEIVED', function (event, data) { if ($scope.user.userID == data.otherUserID) { console.log($scope); $scope.showAcceptDeclinePanel = true;

我有一个基于特定条件发布某些事件的服务。此代码不起作用:

 $scope.$on('INTEREST_RECEIVED', function (event, data) {
                if ($scope.user.userID == data.otherUserID) {
                    console.log($scope);
                    $scope.showAcceptDeclinePanel = true;
                    $scope.showInterestYesNoPanel = false;
                }

        });
但这一个是:

 $scope.$on('INTEREST_RECEIVED', function (event, data) {
            $timeout(function () {
                if ($scope.user.userID == data.otherUserID) {
                    console.log($scope);
                    $scope.showAcceptDeclinePanel = true;
                    $scope.showInterestYesNoPanel = false;
                }
            }, 50);
        });

我必须保持一个50毫秒的超时时间,然后它才能正常工作。我是否遗漏了什么或为什么会发生这种情况?

在触发事件后,尝试在您的作用域上调用$apply:

$scope.$on('INTEREST_RECEIVED', function (event, data) {
                if ($scope.user.userID == data.otherUserID) {
                    console.log($scope);
                    $scope.showAcceptDeclinePanel = true;
                    $scope.showInterestYesNoPanel = false;
                    $scope.$apply()
                }

        });

跟那没关系。当你说它不起作用的时候。你是什么意思?你在做Angular生命周期之外的事情吗?这将证明使用
$timeout
工作的原因,因为
$timeout
$apply
(或
$digest
)块中运行代码,让angular知道更改。查看此代码时很难说什么,但我猜是data或$scope。user是一个承诺,您应该等待它们得到解决“INTEREST_RECEIVED”是如何触发的?如果它是由jQuery或javascript事件触发的,则超时将触发摘要循环。如果它是由ng指令(如ng click)触发的,则不需要超时,因为angular会在之后自动调用$apply。这就完成了任务。您能解释一下原因吗?我假设您收到的事件是由Angulars生命周期之外的jQuery或javascript触发的。因此,您需要手动“告诉”您的环境对您的范围所做的更改。您可以通过调用$scope.$apply()来实现这一点