AngularJS在重新分配时失去对服务变量的引用?

时间:2013-08-15 18:00:15

标签: javascript angularjs

我不知道更好的方式来表达这个问题。我写了一个基本服务供两个控制器使用。

JsFiddle:http://jsfiddle.net/aditya/2Nd8u/2/

点击“通知”按预期工作;它会向数组添加通知。但'重置'打破了它。 “重置”后单击任一按钮不会执行任何操作。有谁知道这里发生了什么?

PS。我认为它与Angular失去引用有关,因为notifs被重新分配(技术上),所以我写了getter和setter,但即使清空数组也涉及pop()直到它为空,这看起来效率不高。

如果JsFiddle关闭,则为Plunkr:http://plnkr.co/edit/mzfLLjFXCwsxM5KDebhc

2 个答案:

答案 0 :(得分:4)

我已经分配了你的plunker并提出了解决方案:

在reset函数中,尝试删除数组的对象,而不是声明为新的空数组:

notificationService.notifs.splice(0, notificationService.notifs.length);

或者,像@Wizcover建议的那样:

notificationService.notifs.length = 0

这将通知角度是原始数组中的修改。

答案 1 :(得分:2)

我将您的服务更改为:

.factory("notificationService", function(){
    var notifications = [];
    return {
        notifs: notifications,
        clear: function(){
            angular.copy([], notifications);
        },
        get: function(){ 
            return notifs; 
        }
    }
})

和您的控制人员:

$scope.reset = function(){
        console.log("reset");
        notificationService.clear();
        console.log(notificationService);
    }

它适用于我。

当然它应该有点整洁,因为你应该有一个get,添加和删除方法,而不是通知,但我只想告诉你代码改变的地方。 angular.copy是确保在angular的生命周期内进行更改的方法。

由于你无法绑定变量而只能绑定方法,你可以这样做:

$scope.getNotifications = notificationService.get;

这应该有效。