更新angular.js服务对象,无需扩展/复制
Updating angular.js service object without extend/copy possible?
我有两个服务,想从第二个服务更新第一个服务中的一个变量。在控制器中,我将范围变量设置为第一个服务的getter。
问题是,当服务变量发生变化时,连接到控制器的视图不会更新,除非我使用angular.extend/copy。看起来我应该可以在下面设置selectedBuilding
,而不必使用extend/copy。是我做错了什么,还是你必须这样做?
控制器
app.controller('SelectedBuildingCtrl', function($scope, BuildingsService) {
$scope.building = BuildingsService.getSelectedBuilding();
});
服务1
app.factory('BuildingsService', function() {
var buildingsList = [];
var selectedBuilding = {};
// buildingsList populated up here
...
var setSelectedBuilding = function(buildingId) {
angular.extend(selectedBuilding, _.find(
buildingsList, {'building_id': buildingId})
);
};
var getSelectedBuilding = function() {
return selectedBuilding;
};
...
return {
setSelectedBuilding: setSelectedBuilding,
getSelectedBuilding: getSelectedBuilding
}
});
服务2
app.factory('AnotherService', function(BuildingsService) {
...
// something happens, gives me a building id
BuildingsService.setSelectedBuilding(building_id);
...
});
提前感谢!
执行此代码时:
$scope.building = BuildingsService.getSelectedBuilding();
$scope.building
是复制的,是对内存中与服务的selectedBuilding
相同的对象的引用。将另一个对象分配给selectedBuilding
时,$scope.building
仍然引用旧对象。这就是为什么视图没有更新,而您必须使用angular.copy/extend
。
如果您需要为selectedBuilding
:分配新对象,可以尝试以下解决方案来避免此问题
app.factory('BuildingsService', function() {
var buildingsList = [];
var building = { //create another object to **hang** the reference
selectedBuilding : {}
}
// buildingsList populated up here
...
var setSelectedBuilding = function(buildingId) {
//just assign a new object to building.selectedBuilding
};
var getSelectedBuilding = function() {
return building; //return the building instead of selectedBuilding
};
...
return {
setSelectedBuilding: setSelectedBuilding,
getSelectedBuilding: getSelectedBuilding
}
});
使用此解决方案,您必须更新视图以替换$scope.building
到$scope.building.selectedBuilding
的绑定。
在我看来,我将坚持使用angular.copy/extend
来避免这种不必要的复杂性。
我认为您的服务不需要扩展。您应该能够直接观看服务并对更改做出响应:
app.controller('SelectedBuildingCtrl', function($scope, BuildingsService) {
// first function is evaluated on every $digest cycle
$scope.$watch(function(scope){
return BuildingsService.getSelectedBuilding();
// second function is a callback that provides the changes
}, function(newVal, oldVal, scope) {
scope.building = newVal;
}
});
$watch上的更多信息:https://code.angularjs.org/1.2.16/docs/api/ng/type/$rootScope.Scope
相关文章:
- Chrome 扩展程序复制和粘贴
- AngularJS:复制与扩展
- jQuery扩展对以前闭包的复制
- 猫鼬 + lodash 扩展对象复制数组不正确
- 从网页版式扩展程序复制数据
- 为什么 jQuery 扩展深拷贝不递归复制对象
- 如何制作chrome扩展以将所选内容复制到剪贴板
- 如何防止jQuery扩展深度副本复制我的一些自定义属性
- 如何在Chrome扩展中复制/粘贴
- 如何从Google Chrome扩展将HTML格式的文本复制到剪贴板
- Chrome扩展复制当前的URL和打开选项卡来执行操作
- 如何复制和粘贴文本从一个选项卡到另一个javascript (chrome扩展)
- 如何在拖放中扩展数据复制
- Chrome扩展:以编程方式检查元素和"复制xpath"或者“复制CSS路径”
- 试图创建一个chrome扩展,将从浏览器选项卡a复制数据,并填写在浏览器选项卡B上的表单
- 有没有办法复制'扳手'菜单中的Chrome扩展
- 更新angular.js服务对象,无需扩展/复制
- 复制反应组件属性时,扩展语法出错
- 学生尝试复制下划线的扩展函数
- Chrome扩展-如何选择标签和复制的所有文本