【问题标题】:Reqiurejs and Backbone - Collection fetchReqiurejs 和 Backbone - 集合获取
【发布时间】:2014-01-26 16:51:44
【问题描述】:

当我手动定义我的收藏内容时,一切正常。但是在我尝试从服务器获取数据(我得到有效的响应)之后,我的视图没有显示。集合视图 (ul) 正在显示,但单个视图 (li) 不显示?将数据提取到集合时我需要注意什么?

更新

ma​​in.js

    require.config({

   paths: {

       "jquery":"vendor/jquery/jquery",
       "underscore":"vendor/underscore-amd/underscore",
       "backbone":"vendor/backbone-amd/backbone",
       "text":"../vendor/requirejs/text",
       "mustache": "../vendor/mustache/mustache"

   },

    shim: {

        underscore: {
          exports: "_"
        },
        backbone: {
          deps: ['underscore', 'jquery'],
          exports: 'Backbone'
        } 
  }


});

require([

  'app',
], function(App){
  // The "app" dependency is passed in as "App"
  App.initialize();
});

app.js

define([
  'jquery',
  'underscore',
  'backbone',
  'collections/ObjaveCollection',
  'views/ObjaveView'

], function($, _, Backbone,ObjaveCollection,ObjaveView){

  var initialize = function(){

      var objave = new ObjaveCollection(); 
      objave.fetch();

      var objaveView = new ObjaveView({ collection: objave});
      $(document.body).append(objaveView.render().el);

    }

  return {

      initialize : initialize

  };
});

ObjavaModel.js

define([
  'jquery',
  'underscore',
  'backbone'
], function($, _, Backbone){

    var ObjavaModel = Backbone.Model.extend({

        defaults:{

            naslov: 'My service',
            cijena: 100,

        }

    });


  return ObjavaModel;

});

ObjaveCollection.js

define([
  'jquery',
  'underscore',
  'backbone',
  'models/ObjavaModel'
], function($, _,Backbone,ObjavaModel){

        var ObjaveCollection = Backbone.Collection.extend({
        model: ObjavaModel

    });

  return ObjaveCollection;

});

ObjavaView.js

define([
  'jquery',
  'underscore',
  'backbone',
  'text!templates/objavaTemplate.html',
  'mustache',

], function($, _, Backbone,objavaTemplate,Mustache){

    var ObjavaView = Backbone.View.extend({

        tagName: "li",

       initialize: function () {

            this.template = objavaTemplate;

        },

        render: function() {

        rendered = Mustache.to_html(this.template, this.model.toJSON());
       $(this.el).html(rendered);


         return this;
        }

    });

  return ObjavaView;

});

ObjaveView.js

define([
  'jquery',
  'underscore',
  'backbone',
  'views/ObjavaView'

], function($, _, Backbone,ObjavaView){

     var ObjaveView = Backbone.View.extend({

        tagName: 'ul',

        render: function() {
       this.collection.each(function(item) {
        console.log(item);
       var objavaView = new ObjavaView({ model: item });
       console.log(this.$el);
        this.$el.append(objavaView.render().el);
    }, this);

   return this;

  }

});

  return ObjaveView;

});

【问题讨论】:

    标签: backbone.js collections requirejs fetch


    【解决方案1】:

    您是否在获取数据后重新渲染视图?例如,在您的视图(ObjaveView.js)中添加:

    initialize: function () {
      this.listenTo(this.collection, "sync", this.render);
    }
    

    【讨论】:

    • 不,我想看看我的错误。我已经更新了问题并添加了我的代码。感谢您的回复。
    • 尝试将上面的 sn-p 添加到 ObjaveView.js,应该可以工作
    • 在 app.js 中,如果你替换了 objave.fetch();使用 objave.reset([{test: 1}, {test: 2}]); (或一些更真实的数据)它有效吗?
    • 有趣!我忘记了 Backbone 1.1.0 中的行为略有改变。所以,在你的 ObjaveView.js 中,而不是我建议的,添加 this.collection.on("sync", this.render, this); (我正在更新答案)
    • 我再次更新了答案 - 尽可能使用 listenTo - 当您使用 view.remove();事件侦听器将被删除,并将帮助您避免内存泄漏。
    猜你喜欢
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多