【问题标题】:Backbone.js Model to View ConnectionBackbone.js 模型查看连接
【发布时间】:2013-07-11 21:12:25
【问题描述】:

我是 Backbone.js 新手。我只是在玩弄它。我想知道模型是否与视图相关。在提供的todos 示例中,我看到在 addOne 方法中,创建了一个新视图并将其与新创建的模型关联并附加。

  window.AppView = Backbone.View.extend({
     // view code
     addOne: function(todo) {
          var view = new TodoView({model: todo});
          this.$("#todo-list").append(view.render().el);
     }
  }

当我尝试做类似的事情时,我收到一条错误消息,提示“在未定义的情况下找不到绑定方法”。

window.TodoView = Backbone.View.extend({

     initialize: function() {
          _.bindAll(this, 'render', 'close');
          this.model.bind('change', this.render); // I got the error at this place. 
          this.model.view = this;
     }
});

为了解决这个问题,我必须将新创建的模型作为参数传递给视图构造函数,并且我必须执行this.model = task 以便关联它。

window.TodoView = Backbone.View.extend({

     initialize: function(task) {
          _.bindAll(this, 'render', 'close');
          this.model = task
          this.model.bind('change', this.render);// now there is no error
          this.model.view = this;
     }
});

window.AppView = Backbone.View.extend({


   insertTask:function(){
        var newTask, newTaskView;
        newTask = new Task(JSON.parse(xhr));
        Tasks.create(newTask);
        newTaskView = new TaskView({ model: newTask });
        $("#todo_list").append(newTaskView.render().el);
        this.input.val('');
}

});

但是 todos 示例中没有这样的内容。在 todos 示例中,新模型如何与新视图隐式关联?

谢谢

【问题讨论】:

  • 你在哪里有Task构造函数?
  • 在您对this.model.bind 的调用中,您需要传递正确的上下文。该模型在其上下文中使用this,因此您需要告诉它渲染视图而不是自身。 this.model.bind('change', this.render, this);

标签: javascript backbone.js


【解决方案1】:

这根本不是隐含的,它在这一行中是明确的:

var view = new TodoView({model: todo});

这是创建一个新的TodoView 视图并将其model 属性设置为addOne 函数的唯一参数(todo,它是一个模型)。

每当向Todos 集合添加新模型时,都会以新模型作为参数调用addOne 方法。

Todos.bind('add', this.addOne);

然后,在addOne 中,为该模型创建一个新视图,并通过{model: todo} 明确设置关系。我怀疑这是您的代码版本中缺少的内容。

您似乎试图做的是在视图的 init 函数中将视图和模型链接起来,这很好,但如果您这样做,您就得靠自己了——这意味着您需要设置模型 自己查看关系(通过将模型作为参数传递给视图初始化函数来解决)。

【讨论】:

  • 当我尝试像 {model : todo } 进行设置时,我得到一个错误,即没有为更改定义绑定。基本上,传递的是一个没有骨干模型特定方法的普通对象:(
  • 你在哪里设置{model: todo},你还没有展示你的代码。您确定todo 变量在该上下文中不为空吗?
  • 我已经用创建新任务视图的代码更新了问题。不,它不是空的,它是一个普通的对象。
  • 我正在寻找“正确”的方法来做到这一点。视图应该决定它附加到哪个模型还是模型应该决定?谁负责主干中的视图模型连接?
  • @SimpleAsCouldBe 没有“正确”的方式,参见backbonejs.org/#FAQ-tim-toady“Backbone.js 旨在对客户端代码中的许多常见模式相当不可知”...“模型和模型之间的引用可以通过多种方式处理视图"
猜你喜欢
  • 2012-08-27
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多