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