向骨干中的原型对象添加值不起作用

时间:2013-09-09 01:30:30

标签: javascript jquery backbone.js

在骨干网中,我有一个名为" mistakes_dict"的自定义原型对象的视图。我想记下所犯的错误,所以我希望misrors_dict坚持下去。但是当" next_stage"方法运行,未定义mistakes_dict。为什么会这样?当我在nexstage方法中本地定义错误dict时,它工作正常,但当然下次方法运行时,相同的字典不可用。

作为旁注,如果字典尚未存在(值为1),如何使字典创建新密钥,如果它存在则将其递增1?我知道如何在Python中执行此操作,但我是JS的新手。

window.View = Backbone.View.extend({

    mistakes_dict: {},

    initialize: function () {
        this.render();
    },

    events: {
        "click .nextstage"   : "nextstage"
    },

    nextstage: function () {
      var mistakes_string = $("span.highlighted").text();
      for(var i = 0, len = mistakes_string.length; i < len; i++){
        mistakes_dict[mistakes_string[i]] = 1;
      };

    },

    render: function () {
      this.$el.html(this.template(this.model.toJSON()));
        return this;
    }
});

2 个答案:

答案 0 :(得分:0)

mistakes_dict 直接在视图中定义。

因此您需要使用this上下文来访问它

mistakes_dict[mistakes_string[i]] = 1;

应该是

this.mistakes_dict[mistakes_string[i]] = 1;

答案 1 :(得分:0)

您在window.View = Backbone.View.extend({ ... })中定义的内容会附加到原型中,因此您必须通过this访问它们:

for(var i = 0, len = mistakes_string.length; i < len; i++){
    this.mistakes_dict[mistakes_string[i]] = 1;
}

当然,由于mistakes_dict实际上已附加到视图原型,因此您在mistakes_dict的所有实例之间共享一个View对象;您可以将原型上的属性视为一类属性。如果你想在每个实例上有一个不同的mistakes_dict,那么在构造函数中分配它:

window.View = Backbone.View.extend({
    initialize: function () {
        this.mistakes_dict = { };
        this.render();
    },
    //...