【问题标题】:Why is the Backbone Views el undefined?为什么主干视图 el 未定义?
【发布时间】:2014-06-05 11:48:01
【问题描述】:

我不确定为什么我的 Backbone.View 中的 el 未定义。

这是我当前代码的一个小提琴:http://jsfiddle.net/NC47C/

这里是 JavaScript:

var TheModel = Backbone.Model.extend({
  defaults: {
    color: 'Red',
    message: null,
    endOfLine: null
  }
});

var TheCollection = Backbone.Model.extend({
  model: TheModel,

  url: 'http://jsonstub.com/test/1'
});

var ParentView = Backbone.Model.extend({
  el: '.js-parent',

  initialize: function () {
    this.collection = new TheCollection();
    console.log(this.$el);

    return this;
  },

  myTemplate: function (scriptID, data) {
    var temp = _.template( $(scriptID).html(), {model: data} );

    this.$el.html(temp);

    return this;
  },

  render: function () {
    var self = this;

    this.collection.fetch({
        type: 'GET',
        beforeSend: function (request) {
            request.setRequestHeader('JsonStub-User-Key', 'xxxxxxxxxxxxx');
            request.setRequestHeader('JsonStub-Project-Key', 'xxxxxxxxxxxx');
        },
        success: function (data) {
            console.log( 'data =',data.toJSON() );

            self.myTemplate('#parentTemplate', self.collection);
        },
        error: function () {
            console.log('ERROR!!!');
        }
    });   

    return this;
  }

});

var parent = new ParentView();
parent.render();

这是我的 HTML:

<script type="text/template" id="parentTemplate">
  <h1>hi</h1>
</script>


<div class="js-parent">

</div>

【问题讨论】:

  • 当您尝试构建 view 时,为什么要扩展 Backbone.Model?你不是说var ParentView = Backbone.View.extend({ ... })吗?如果你扩展正确的东西,似乎工作正常:jsfiddle.net/ambiguous/x87Yn 你也应该做var TheCollection = Backbone.Collection.extend 来建立一个集合......
  • 除了对答案中 el 对象的长时间讨论之外, mu 太短是正确的。你在扩展错误的东西。如果您扩展视图而不是模型,则可以正常工作。
  • 哇,我瞎了!非常感谢您的帮助!我不敢相信当我指的是 Backbone.View.extend 时我输入了 Backbone.Model.extend。谢谢!

标签: javascript jquery backbone.js


【解决方案1】:

有几件事可以解释——我对视图 $el 为什么返回 undefined 的直接预感是,因为它是父视图,所以在实例化视图时还没有创建模板中的 HTML。结果,它在 DOM 中找不到类“js-parent”。解决此问题的方法包括:

1) 在视图初始化函数中获取集合,然后从集合获取success 回调中调用渲染。

来自mu的See this answer太短(SO骨干王)

2) 如果不这样做,请尝试分离视图的创建和渲染。您可以附加到硬编码(在您的 index.html 中)'appWrapper' div 元素,然后执行:

 var parent = new ParentView(); 
 $('#appWrapper').html(parent.render().el);

3) 从 jquery ready 函数中调用渲染(那将是绝望的时刻)。

作为附加说明,最好不要在视图中定义 $el。

最后,我阅读的大多数主干代码都使用这种方法进行模板渲染:this.template(this.model.toJSON());

【讨论】:

  • 或者可能是因为创建视图,他正在扩展模型。
  • 呻吟。是的,到时候就是这样。
  • @MikeWu 我应该在视图之外实例化模型吗?我早上在看这个,我并不觉得我需要这个收藏品。我正在尝试进行 ajax 调用,并认为我想为此使用集合的 fetch 方法。
  • @MikeWu 没关系,我从其他 cmets 看到我的错误。谢谢!
【解决方案2】:

始终使用 el 和 $el。这是我发现困难的方式。我正在阅读 Addy Osmani 的书中关于骨干的内容。上面提到了$el和el是一回事,但是在尝试结果却不是这样。也许这是新版本主干的变化,但我不确定。

【讨论】:

  • 谢谢!我的印象是 view.$el 将是元素的 jQuery 选择器。
  • 我认为 View.$el 是。 $el 是 $(el) 的简写。所以 View.el 不同于 View.$el
  • @Mdd 是的,我也有同样的想法。看,el==$el 是假的。
  • @Mdd 同样的事情让我感到困惑。也许提交一个错误报告,看看他们怎么说。我看不出有更好的方式让他们参与对话。
  • 好的,澄清一下整个对话取决于我们正在讨论的 Backbone 版本。看起来旧版本处理 el 和 $el 的方式与新版本不同。
猜你喜欢
  • 2013-02-16
  • 2013-07-03
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多