dojo存储内存:在使用put()调用之前,数据正在更新。

时间:2014-05-24 10:14:15

标签: dojo

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的行为吗?

1 个答案:

答案 0 :(得分:0)

这是JavaScript的行为,而不是dojo/store/Memory

查看dojo/store/Memory::get(id)方法的实现。它返回存储在data属性数组中的对象。在JavaScript中,对象通过引用传递,这意味着jimoldjim都指向内存中的相同位置。您可以轻松查看它(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课程。