为模型问题传递变量

Passing variable for model issue

本文关键字:变量 问题 模型      更新时间:2023-09-26

我有一个backbonejs应用程序,有一个父视图,如:

var LibraryView = Backbone.View.extend({
   initialize: function(options) {
      if (options) {
        _.extend(this, options);
      }
      this.render();
      alert(this.model); //Alerts Object Object like it's supposed to
      _.each(this.model.get("library").books, function(book){
          var bookView = new BookView({
              el: $('#books'),
              book: book,
              model: this.model
          });
          bookView.render();
      });
   }
});

和我的bookView看起来像:

var BookView = Backbone.View.extend({
    initialize: function(options) {
       if (options) {
          _.extend(this, options);
       }
       alert(this.model); // Alerts undefined
    }
});

基本上,我想通过这个。模型从LibraryView到BookView,但当我这样做时,BookView的alert(this.model)警报未定义?

我应该提到,当我在我的BookView上alert(this.book)时,它不是未定义的

这是因为this已经改变了_.each中的上下文。关于它的帖子有上百万条,所以我就不解释了。以这样的结尾(以this结尾)来保持上下文:

   _.each(this.model.get("library").books, function(book){
          var bookView = new BookView({
              el: $('#books'),
              book: book,
              model: this.model
          }, this);

也查看下划线的_.bindAllhttp://underscorejs.org/bindAll

您的问题与this的定义方式有关。this在函数体中的含义由如何调用父函数来控制。幸运的是,_.each允许您将上下文(在函数体中等同于上下文)作为可选的第三个参数传入。这里的文档:http://underscorejs.org/#each。

不幸的是,这只为第一个函数绑定了this的值,这个函数是您传递给_.each函数的匿名函数。当您调用BookView构造函数时,这不会绑定this,因为它是一个单独的函数。当你调用一个函数时,它会创建一个单独的作用域,这意味着它的值不同。一个解决方案是在构造函数中使用bind

Try this:

  _.each(this.model.get("library").books, function(book){
      var bookView = new BookView({
          el: $('#books'),
          book: book,
          model: this.model
      }).bind(this);
      bookView.render();
  }, this);

进一步的阅读可以在这里找到this的不同定义方式以及如何使用_.bind_.bindAll: http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html