Dojo takeit版本:1.9.3
我从这里开始学习dojo / store / memory。
https://dojotoolkit.org/documentation/tutorials/1.8/intro_dojo_store/
我尝试在教程中运行示例并进行一些修改 在进行put()调用之前,先调用get()(var oldjim = employeeStore.get(“Jim”);)调用以检查内存存储中的值。 我可以看到数据已经改变了。
// retrieve object with the name "Jim"
var jim = employeeStore.get("Jim");
// show the department property
console.log("Jim's department is " + jim.department);
// iterate through all the properties of jim:
for(var i in jim){
console.log(i, "=", jim[i]);
}
// update his department
jim.department = "engineering";
// START *** Modified code
// Get the old data for "jim"
var oldjim = employeeStore.get("Jim");
// Displays the OLD data before making a put() call to the store.
console.log("oldJim's department is " + oldjim.department);
// output "oldJim's department is engineering"
// END *** Modified code
// and store the change
employeeStore.put(jim);
这是dojo / store / memory的行为吗?
答案 0 :(得分:0)
这是JavaScript的行为,而不是dojo/store/Memory
。
查看dojo/store/Memory::get(id)
方法的实现。它返回存储在data
属性数组中的对象。在JavaScript中,对象通过引用传递,这意味着jim
和oldjim
都指向内存中的相同位置。您可以轻松查看它(jsFiddle):
console.log(jim === oldjim); // true
要避免此行为,您可以修改dojo/store/Memory
类,以便它返回对象的副本(克隆):
require(["dojo/_base/declare", "dojo/_base/lang", "dojo/store/Memory"], function(declare, lang, Memory){
var ModifiedMemory = declare(Memory, {
get: function(id) {
return lang.clone(this.data[this.index[id]]);
}
});
});
在这种情况下(使用ModifiedMemory
代替Memory
),jim === oldjim
将评估为false
,因为它们不再是同一个对象(即有2个)现在在内存中复制)因此dojo/store/Memory::put()
将按预期的那样工作。
请参阅jsFiddle上的ModifiedMemory
课程。