为模型问题传递变量

时间:2014-08-16 21:00:54

标签: javascript jquery backbone.js

我有一个具有父视图的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
    }
});

基本上,我正在尝试将this.model从LibraryView传递给BookView,但是当我这样做时,BookView的alert(this.model)警告未定义?

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

2 个答案:

答案 0 :(得分:1)

这是因为this改变了_.each中的上下文。关于它的帖子有一百万,所以我不会解释。 结束你们每个人(有了这个)来保持背景:

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

也看看Underscore的_.bindAll http://underscorejs.org/#bindAll

答案 1 :(得分:0)

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

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

试试这个:

  _.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和{{1}}的不同方式进一步阅读:http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html