1

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

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

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

PS。我认为这与 Angular 丢失引用有关,因为notifs它被重新分配(技术上),所以我编写了 getter 和 setter,但即使清空数组也需要pop()ing 直到它为空,这似乎不是很有效。

如果 JsFiddle 宕机,Plunkr:http: //plnkr.co/edit/mzfLLjFXCwsxM5KDebhc

4

2 回答 2

4

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

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

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

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

notificationService.notifs.length = 0

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

于 2013-08-15T18:24:33.967 回答
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、add 和一个 remove 方法而不是通知,但我只是想告诉你代码在哪里发生了变化。这angular.copy是确保在 Angular 的生命周期内进行更改的方法。

由于您不能绑定变量而只能绑定方法,因此您可以这样做:

$scope.getNotifications = notificationService.get;

那应该行得通。

于 2013-08-15T18:31:19.937 回答