很抱歉这个问题,但我是JavaScript新手 我已经定义了一个对象
define(['sharedServices/pubsub', 'sharedServices/topics'], function (pubsub,topics) {
'use strict';
function Incident() {
var that = this;
this._dtasks = [];
this.handlePropertyGet = function(enstate, ename) {
if (!this.entityAspect || !this.entityAspect.entityManager || !this.entityAspect.entityManager.isReady) {
enstate = [];
} else {
enstate = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
}
return enstate;
};
Object.defineProperty(this, 'DTasks', {
get: function () {
return this.handlePropertyGet(this._dtasks, "DTasks");
},
set: function (value) { //used only when loading incidents from the server
that.handlePropertySet('DTask', value);
},
enumerable: true
});
}
return {
Incident: Incident
};
});
当我调用属性DTasks时内部成员_dtask等于[],即使我输入get属性,我看到当handlePropertyGet完成并返回到获取范围时,enstate填充了对象_dtasks仍然是空的,它不应该作为参考传递吗?
答案 0 :(得分:0)
this._dtasks
“指向”数组。如果您将其作为参数传递给this.handlePropertyGet
,则可以使enstate
引用相同的数组。
如果您更改数组(如enstate.push("bar")
中所示),则更改也会影响this._dtasks
:您实际上不会更改它们,只会更改它们指向的数组。
然而,行
enstate = []
和
enstate = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
不要修改已有的阵列。相反,他们创建新数组并更改enstate
以便指向它们。但是,this._dtasks
保持不变。
修复它的一种简单方法是将getter中的代码更改为
return this.handlePropertyGet("_dtasks", "DTasks");
和handlePropertyGet
到
this.handlePropertyGet = function(enstate, ename) {
if (!this.entityAspect || !this.entityAspect.entityManager || !this.entityAspect.entityManager.isReady) {
this[enstate] = [];
} else {
this[enstate] = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
}
return this[enstate];
};
这样,您将直接更改this._dtasks
的值。
作为替代方案,您可以通过将enstate = []
更改为enstate.length = 0
(清除数组而不是更改变量来实现相同的结果。请参阅https://stackoverflow.com/a/1232046/3191224)和enstate = this.entityAspect.[...]
到
var newContent = enstate = this.entityAspect.entityManager.executeQueryLocally(new breeze.EntityQuery(ename).where('IncidentID', 'eq', this.IncidentID));
enstate.length = 0;
Array.prototype.push.apply(enstate, newContent);
清除数组然后从另一个数组中推送所有元素,有效地替换整个内容而不更改enstate
本身。
答案 1 :(得分:0)
我的猜测是你正在尝试做这样的事情
的Javascript
function Incident() {
var reset = false;
this._dtasks = [];
this.handlePropertyGet = function (ename) {
if (reset) {
this._dtasks = [];
} else {
this._dtasks = [1, 2, 3];
}
return this._dtasks;
};
Object.defineProperty(this, 'DTasks', {
get: function () {
return this.handlePropertyGet("DTasks");
},
enumerable: true
});
}
var x = new Incident();
console.log(x.DTasks);
输出
[1, 2, 3]
上
因此,您可以将此简化示例与@ user3191224
提供的想法一起使用