3

我想知道如何告诉主干等到我的集合获取模型然后渲染下划线位。

在控制台中从下划线模板返回一个字段缺失的错误。当我 console.log(this.collection.toJSON()) 它不显示任何数据。所以我假设,视图是在获取数据之前呈现的。我如何告诉视图等到它被获取?

/////// 看法////////

define([
  'jquery',
  'underscore',
  'backbone',
  'collections/mitarbeiter',
  'text!/aquilamus/templates/mitarbeiter/mitarbeiter.html'
], function($, _, Backbone, MitarbeiterCollection, MitarbeiterTemplate){



 var MitarbeiterListView = Backbone.View.extend({
    el: $("#container"),
    initialize: function(){
      this.collection = new MitarbeiterCollection;
      this.collection.fetch();
      var newtemplate = MitarbeiterTemplate;
      this.template = _.template($(newtemplate).html());
    },
    render: function(){
      var renderedContent = this.template(this.collection.toJSON());

      $(this.el).html(renderedContent);
      return this;
    }


  });
  // Our module now returns our view
  return MitarbeiterListView;
});
4

5 回答 5

11

像其他人建议的作品一样使用reset,但这里有一个替代方案。

define([
  'jquery',
  'underscore',
  'backbone',
  'collections/mitarbeiter',
  'text!/aquilamus/templates/mitarbeiter/mitarbeiter.html'
], function($, _, Backbone, MitarbeiterCollection, MitarbeiterTemplate){

 var MitarbeiterListView = Backbone.View.extend({
    el: $("#container"),
    initialize: function(){
      this.collection = new MitarbeiterCollection;

      var newtemplate = MitarbeiterTemplate;
      this.template = _.template($(newtemplate).html());
    },
    render: function(){
      var self = this;

      // show some loading message
      this.$el.html('Loading');

      // fetch, when that is done, replace 'Loading' with content
      this.collection.fetch().done(function(){
          var renderedContent = self.template(self.collection.toJSON());
          self.$el.html(renderedContent);
      });
      return this;
    }

  });
  // Our module now returns our view
  return MitarbeiterListView;
});

另一种选择是做一些与此非常相似的事情,除了使用你可以放在 fetch 选项中success回调函数。

于 2013-03-22T17:49:40.417 回答
2

这对我来说效果最好:

var ArtistListView = Backbone.View.extend({
        el: '.left',
        initialize:function(){
            this.render();
        },
        render: function () {
            var source = $('#my-list-template').html();
            var template = Handlebars.compile(source);
            var collection = new MyCollection;
            collection.fetch({async:false});
            var html = template(collection.toJSON());
            $(this.el).html(html);
       });
于 2013-12-21T23:42:35.123 回答
1

我不知道有什么办法可以说要等待,但我知道你可以告诉骨干网在你的收藏被提取时(重新)渲染。

initialize: function(){
      this.collection = new MitarbeiterCollection;
      this.collection.fetch();
      var newtemplate = MitarbeiterTemplate;
      this.template = _.template($(newtemplate).html());
      this.collection.on('reset', this.render, this);
    },

最后一行监听你的集合reset事件。当它被触发时,它将调用该render方法。

于 2013-03-22T17:43:04.767 回答
1

提取完成时,集合提取会触发事件“重置”。您可以利用该fetch事件

this.collection.on('reset', this.render);
于 2013-03-22T17:47:24.043 回答
1

fetch还允许您传递success将在 fetch 成功时调用的处理函数,即:

  this.collection.fetch({success: this.render});
于 2013-03-22T18:52:52.247 回答