实例化覆盖以前的实例(Backbone.js模型)

时间:2015-09-13 12:02:29

标签: javascript backbone.js underscore.js

我似乎对这个小片段有疑问。我已经摆弄了很长一段时间,并且当在同一模型的下一个实例化中更改同名的全局属性时,它会覆盖所有先前实例化的全局属性。

这个问题的影响打破了我正在构建的简单Web导航编辑器,其中每次获取Collection时,即使它们是相同Collection类型的单独实例,它们也会覆盖任何其他集合上的任何模型,因为被覆盖的全局变量。

毋庸置疑,我已经连续三天撞墙了,无法弄明白,也没有找到与此类问题相关的谷歌。非常感谢您对此问题的任何帮助。

JSFiddle:http://jsfiddle.net/alexgurrola/ruv11nkn/

// Create Example Model
var Model = Backbone.Model.extend({
    globals: {
        attributes: {},
        set: function (prop, value) {
            this.attributes[prop] = value;
        },
        get: function (prop) {
            return this.attributes[prop]
        },
        has: function (prop) {
            return _.has(this.attributes, prop);
        },
        iterate: function (prop) {
            if (!this.has(prop)) this.set(prop, 0);
            return ++this.attributes[prop];
        }
    },
    local: "Unknown"
});

// Create First Instance
var Instance = new Model();
Instance.local = "Instance";
Instance.globals.set("name", "Instance");

// Create Second Instance, which will Overwrite the First, Unintentionally
var Overwrite = new Model();
Overwrite.local = "Overwrite";
Overwrite.globals.set("name", "Overwrite");

1 个答案:

答案 0 :(得分:2)

因为您的$('.ui.checkbox').checkbox(); 对象是使用$('.ui.checkbox').checkbox() .on('change', e => fireEvent(e.target, 'input')); function createEvent(name) { var event = document.createEvent('Event'); event.initEvent(name, true, true); return event; } function fireEvent(element, name) { var event = createEvent(name); element.dispatchEvent(event); } 声明的,所以上下文绑定到该对象,而不是您稍后创建的实例。它基本上就像一个静态变量,因此每个实例都将引用相同的global对象。

您似乎想要的是让模型的每个实例都拥有它自己的Model,例如,通过在初始化函数中设置它而不是

attributes

这将确保每个实例创建自己的attributes,并且在调用var Model = Backbone.Model.extend({ initialize: function () { this.globals = { attributes: {}, set: function (prop, value) { this.attributes[prop] = value; }, get: function (prop) { return this.attributes[prop] }, has: function (prop) { return _.has(this.attributes, prop); }, iterate: function (prop) { if (!this.has(prop)) this.set(prop, 0); return ++this.attributes[prop]; } } } }); 时正确绑定上下文。

但是,我对你为什么要这样做有点好奇。看起来你有点在模型中重新实现一个模型?