Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS在重新分配时丢失对服务变量的引用?_Javascript_Angularjs - Fatal编程技术网

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

Javascript AngularJS在重新分配时丢失对服务变量的引用?,javascript,angularjs,Javascript,Angularjs,我不知道用什么更好的方式来表达这个问题。我已经编写了一个供两个控制器使用的基本服务 JsFiddle: 单击“通知”按预期工作;它向数组中添加通知。但“重置”会破坏它。在“重置”后单击任一按钮都不会执行任何操作。有人知道这里发生了什么吗 另外,我认为这与失去引用有关,因为notifs在技术上被重新分配,所以我编写了getter和setter,但即使清空数组也需要弹出直到它为空,这似乎不是很有效 Plunkr如果JSFIDLE宕机:我已经提出了您的解决方案: 在重置函数中,尝试删除数组的对象,而不

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

JsFiddle:

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

另外,我认为这与失去引用有关,因为notifs在技术上被重新分配,所以我编写了getter和setter,但即使清空数组也需要弹出直到它为空,这似乎不是很有效

Plunkr如果JSFIDLE宕机:

我已经提出了您的解决方案:

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

notificationService.notifs.splice(0, notificationService.notifs.length);
或者像@Wizcover建议的那样:

notificationService.notifs.length = 0
这将通知angular在原始阵列中进行了修改。

我已经提出了您的解决方案:

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

notificationService.notifs.splice(0, notificationService.notifs.length);
或者像@Wizcover建议的那样:

notificationService.notifs.length = 0

这将通知angular在原始阵列中进行了修改。

我将您的服务更改为:

.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方法,而不是notifs,但我只是想告诉您代码在哪里发生了更改。 angular.copy是确保在angular的生命周期内进行更改的方法

由于不能绑定变量,只能绑定方法,因此可以执行以下操作:

$scope.getNotifications=notificationService.get


那应该行。

我将您的服务更改为:

.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方法,而不是notifs,但我只是想告诉您代码在哪里发生了更改。 angular.copy是确保在angular的生命周期内进行更改的方法

由于不能绑定变量,只能绑定方法,因此可以执行以下操作:

$scope.getNotifications=notificationService.get


那应该行。

是JSFIDLE吗?要花很长时间才能在这里加载?速度很慢,但肯定在上面。JSFIDLE在下面吗?在这里加载要花很长时间?速度很慢,但肯定在这里。本着同样的精神,您可以执行notificationService.notifs.length=0,这更高效。本着同样的精神,您可以执行notificationService.notifs.length=0,这更高效。我的问题是为什么我的代码不起作用。这是处理物体和角度的公认做法吗?复制而不是重新分配?我的问题是为什么我的代码不起作用。这是处理物体和角度的公认做法吗?复制而不是重新分配?