防止Angular范围变量通过引用自动绑定到服务私有成员
Prevent from Angular scope variables to bind automatically to the service private members by reference
我有一个在服务内部使用的私有currJobs
成员,并使用getter和setter方法来访问它。此外,如果用户选择编辑特定的作业,我会使用"查找"功能,该功能应该返回作业对象的副本(返回值-*),然后当用户保存编辑后的作业时,我会用另一种方法将现有的作业对象替换为新的作业对象(当然还有向服务器发出的补丁请求)
相反,它似乎返回了对所谓的私人"currJobs"成员的引用(&),这会随着模型的每次改变而导致服务的立即改变。这意味着即使使用没有按save,对象也会在前端更新。
我在谷歌上搜索过,遇到了这个SO问题,但它没有解决"私人服务成员,返回{}结构之外"的问题。
我想知道这怎么可能,什么是好的、健康的和"好的做法"这个问题的解决方案
代码:
app.service('jobsService', function($http, $q, $location, $rootScope, companyService, utils){
var that = this;
that.currJobs = null;
var jobServ = {};
jobsServ.jobsLookup = function(jid, cid) {
if(!that.currJobs || !that.currJobs[cid] || that.currJobs[cid].length == 0){
return false;
}
for(var i = 0; i < that.currJobs[cid].length; i++){
if(jid == that.currJobs[cid][i].id){
var job = that.currJobs[cid][i];
return job;//the following returns a refference
}
}
return false;
},
jobsServ.replaceJob = function(jobData, cid){
if(!that.currJobs)
that.currJobs = {};
if(!that.currJobs[cid])
that.currJobs[cid] = [];
if(that.currJobs && that.currJobs[cid] && that.currJobs[cid].length == 0){
that.currJobs[cid].push(jobData);
return;
}
}
根据这一点,JavaScript传递任何不是基元的东西(int、bool、string)作为引用,所以我的封装显然不起作用。
添加了以下代码:
app.factory('utils', function(){
return{
clone: function(obj) {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}
}
}
app.service('jobsService', function($http, $q, $location, $rootScope, companyService, utils){
var that = this;
that.currJobs = null;
var jobServ = {};
jobsServ.jobsLookup = function(jid, cid) {
if(!that.currJobs || !that.currJobs[cid] || that.currJobs[cid].length == 0){
return false;
}
for(var i = 0; i < that.currJobs[cid].length; i++){
if(jid == that.currJobs[cid][i].id){
var job = utils.clone(that.currJobs[cid][i]);//Fix the problem
return job;
}
}
return false;
}
}
相关文章:
- AngularJS 1.5.x服务未正确绑定,并且未在控制器中更新
- 如何将WinJS ListView绑定到web服务
- 将web服务回调的结果绑定到Javascript中的调用函数
- AngularJS剑道网格绑定到angular服务webapi-当使用[fromuri]进行解析时,排序总是为null
- 为什么角度绑定不't使用服务基元
- 角度控制器不绑定服务对象属性 ng-repeat
- 对视图上函数的角度绑定导致对数据服务的无限调用
- 将服务中的函数绑定到$scope(错误:无法设置undefined的属性'onChange')
- 防止Angular范围变量通过引用自动绑定到服务私有成员
- 服务回调中的KendoUI网格服务器动态列绑定
- 如何将指令模型绑定到异步服务数据
- 将 SOAP 服务绑定到 SAPUI5 simpleform
- AngularJS - 在服务内部对数组进行排序,在控制器/视图中保留绑定
- 将服务注入指令 AngularJS 和数据绑定
- 如何在 AngularJS 中使用服务获取双向数据绑定
- 如何通过绑定的控制器变量访问服务的属性
- 在ASP.NET MVC中使用屏蔽图绑定到web服务数据
- 在Angular JS中绑定服务响应
- 在Angular.js中绑定服务变量
- 使用ControllerAs语法绑定服务变量,不带$scope