【问题标题】:Backbone collection trigger twice when going back返回时触发两次骨干收集
【发布时间】:2013-12-22 11:08:55
【问题描述】:

我的收藏有一个老旧的问题,当我第一次加载复合视图时,一切正常,但是当我开始在我的应用程序中导航,然后回到我的复合视图(Backbone.history.navigate)时,看起来我的收藏是调用了两次(我的 itemview 被触发了两次)。

我尝试调试,但我只获取一次我的集合,只有一个 init,路由器似乎也可以。

这是我的复合视图:

'use strict';
define(["jquery", "backbone", "marionette", "text!templates/portraits/portrait.html", "view/portraits/portraitItemView", "collection/portraitCollection", "application", "JSMovieclip"], function($, Backbone, Marionette, template, PortraitItemView, portraitCollection, App) {
var PortraitsCompositeView = Marionette.CompositeView.extend({
    template : _.template(template),
    collection : portraitCollection,
    tagName: "div",
    id : "articles",
    itemView : PortraitItemView,
    itemViewContainer : '#list-articles',
    itemViewOptions: {
      collection: portraitCollection
    },
    initialize : function (options) {

        _.bindAll(this);
        this.options = options || {};
        this.collection.fetch({
          type: 'POST',
          success : function(data, raw) {
            App.execute('loader', false);
          }
        });
    },

这是我的收藏:

'use strict';
define(["jquery", "underscore", "backbone", "marionette", "model/portraitsModel"], function($, _, Backbone, Marionette, PortraitModel) {
    var PortraitCollection = Backbone.Collection.extend({
        model : PortraitModel,
        sync: function(method, model, options) {

          var params = _.extend({
              type: 'GET',
              dataType: 'jsonp',
              url: 'http://backend.url.fr/api/portraits/get_list/',
              processData: false
          }, options);

          return $.ajax(params);
        },
        parse : function(response) {
            this.totalLength = response.count;
            return response.portraits;
        }
    });
    return new PortraitCollection;
});

【问题讨论】:

  • “看起来我的集合被调用了两次(我的 itemview 被触发了两次)”是什么意思。请更详细地解释一下,我在这段代码中根本看不到调用 itemView 的任何地方。你的意思是每次你路由到初始化PortraitsCompositeView的东西时,集合只被提取一次,还是在你第一次去那里时才被提取?路由器中的代码会很有帮助。
  • 您是否打算将 PortraitCollection 设为单例?返回一个新的 PortraitCollection 而不是返回“Class”的决定是“难闻的气味”!!!

标签: backbone.js triggers marionette backbone.js-collections


【解决方案1】:

您的集合提取正在将项目附加到自身。

您可以将reset:true 添加到您的 Collection.fetch 属性中

initialize : function (options) {

    _.bindAll(this);
    this.options = options || {};
    this.collection.fetch({
      reset: true,
      type: 'POST',
      success : function(data, raw) {
        App.execute('loader', false);
      }
    });
},

【讨论】:

  • 感谢您的回答,但我已经尝试了此解决方案而没有任何更改。 (我在第一条消息中添加了我的收藏。
【解决方案2】:

我终于发现了我的错误,我的 json 返回了一个空的“id”字段,修复它后,一切正常。

【讨论】:

  • 我也有同样的问题,没有空id,还是请求两次。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多