【问题标题】:Backbone and changing model attributes主干和不断变化的模型属性
【发布时间】:2011-11-06 13:43:42
【问题描述】:

我正在开发一个部分基于 Backbone.js todo example app 的应用程序。一切都运行良好,直到我尝试添加编辑功能。我发现了一些奇怪的行为。

我有某种形式,它创建新的模型对象并将其添加到集合中。当创建新模型(绑定到“添加”事件)时,也会创建新视图并将其添加到 dom。就像在那个 todo 应用程序中一样,它可以工作。

现在我尝试添加编辑功能。我在视图对象方法中创建输入元素并尝试“提交”更改。我首先尝试通过简单地使用 view.model.set 方法更改模型属性来做到这一点。这可行,但会触发一些奇怪的事件。这可能很好,因为我想在模型更改时再次渲染视图。

主要问题:在我看来(工作一个)对象有一个包含此调试行的渲染方法:'console.log(this)'。第一次通过表单创建视图对象时,此行输出正确的对象。当我尝试编辑模型并为其设置新值时,调试打印完全不同的对象。这不起作用,渲染失败。

我希望这些例子就足够了。

主视图:

this.myCollection.bind('add', function(model){
    var myView= new myViewRow({
        model: model
    });         
    $("#container").find('tbody').append(myView.render().el);
}, this);

在我的视图中:

render: function() {
    console.log(this);

    var data = this.getAsArray();
    $(this.el).html(content);
    return this;
}

任何提示我做错了什么?触发了什么事件集方法以及为什么我的渲染方法在错误的对象中?

【问题讨论】:

  • 你能发布完整的视图吗?

标签: javascript backbone.js


【解决方案1】:

在 Backbone 视图的初始化方法中试试这个:

_.bindAll(this, "render");

请参阅Backbone.js FAQ 以获取对此的解释。在 Backbone 视图中,一种常见做法是确保 this 变量指向当前函数作用域中定义的 View 对象,正如人们通常希望的那样。

【讨论】:

    【解决方案2】:

    当你绑定监听更改事件时,你必须将监听函数绑定到当前视图http://documentcloud.github.com/backbone/#FAQ-this

    【讨论】:

    • 这很好,可能与我的问题有关。无论如何,我的视图初始化方法中有这一行:this.model.bind('change', this.render, this)
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2016-02-22
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多