Backbone.js 集合模型的主干预渲染

Backbone.js 集合模型的主干预渲染,backbone.js,Backbone.js,我想在集合获取其模型之后但在模型渲染之前执行一个操作,清除父元素 我偶然发现它们是特定于模型的,这将导致在每次模型渲染之前清除父元素 我当然能够执行预抓取操作,但我希望它在抓取完成时和模型渲染之前发生 我尝试在集合上使用重置和更改事件侦听,但这两种方法都导致了不想要的最终结果。 Reset event seamed以该方向执行,但传递的参数是整个集合,而不是集合中的单个模型,因此,由于参数类型(集合而不是所需的模型)不同,无法使用add event回调 当获取集合获取成功但尚未呈现模型时,如何调

我想在集合获取其模型之后但在模型渲染之前执行一个操作,清除父元素

我偶然发现它们是特定于模型的,这将导致在每次模型渲染之前清除父元素

我当然能够执行预抓取操作,但我希望它在抓取完成时和模型渲染之前发生

我尝试在集合上使用重置和更改事件侦听,但这两种方法都导致了不想要的最终结果。 Reset event seamed以该方向执行,但传递的参数是整个集合,而不是集合中的单个模型,因此,由于参数类型(集合而不是所需的模型)不同,无法使用add event回调

当获取集合获取成功但尚未呈现模型时,如何调用回调

模型包含返回的属性,而集合包含用于获取的url和用于返回参数包装对象的解析方法

下面是我用来渲染集合视图的代码,它基本上是渲染集合中每个模型的视图

Collection View
---------------
var FoosView = Backbone.View.extend({
        el: '#plans',
        events: {
            //'click tr': 'rowClick'
        },
        initialize: function() {
            this.listenTo(this.collection, 'add', this.renderNew);

            _.bindAll(this, "render");

            this.render();
        },
        renderNew: function(FooModel) {

            var item = new FooView({model: FooModel});
            this.$el.prepend(item.render().$el);
        }
        ...
    });

The model view
--------
var FooView = Backbone.View.extend({
        tagName: 'li',
        initialize: function(options) {
            this.options = options || {};
            this.tpl = _.template(fooTpl);
        },
        render: function() {
            var data = this.model.toJSON();

            this.$el.html(this.tpl(data));

            return this;
        }
    });

提前谢谢。

我不太确定你在问什么,但你试过了吗:

MyCollection.fetch({
    success: function(models,response) {
         //do stuff here
    }
});
你也可能有兴趣看看

希望有帮助

编辑:在获取和渲染之间没有直接联系。我敢打赌,您将渲染绑定到模型更改


使用=============>>>>好的,我想我理解你的问题,这里有一个建议的解决方案。您现在正在收听收藏中的
reset
事件,并调用
this.renderAll
this.renderAll
将从集合中获取模型列表并将其呈现到页面,但仅在列表元素清空之后。希望这有帮助:)


我不得不对html做一些假设,但我认为上面的代码应该足以让您启动并运行。让我知道它是否有效。

感谢您的回复,我确实尝试过,但成功电话是在模型渲染后发出的。我想在获取成功后调用一个函数,但是模型还没有呈现给DOM。这是可选的吗?您定义了渲染,因此我无法在没有代码的情况下判断发生了什么,您是如何定义渲染的?我已经更新了用于渲染集合视图的代码,这只是渲染集合中的每个模型。如果需要其他任何东西来完成拼图,请告诉我:)。谢谢renderNew方法是为每个检索到的模型调用的,因此对于我要执行的重置行为不是可选的(在模型渲染之前清除父元素。使用.parse方法您从集合中更改事件将在aprse之后触发,因此您可以在渲染之前处理它Hi Shahar,像Francois一样,我不确定我是否理解您的问题。我想您要求在集合重新加载/重置时清空父列表?可以“不要使用renderNew()方法,因为来自
reset
事件的参数是一个模型列表而不是一个模型,对吗?因此您希望使用
this.listenTo(this.collection,'reset',this.someNewMethod);
,其中someNewMethod首先清除列表,然后呈现元素。请告诉我这听起来是否正确。我尝试使用reset,但呈现传递的参数时遇到问题,因为它是一个集合而不是单个模块(我尝试在重置回调中使用renderNew方法,我想这是我的错误…是的,看起来重置事件就是您想要的。我将为您提供一个答案,解释如何进行:).确切地说,我的意图是什么,我想这都是关于我选择的渲染方式。对不起@François Richard,我想我还不够清楚:/
var FoosView = Backbone.View.extend({
    el: '#plans',
    collection: yourCollection, // A reference to the collection.
    initialize: function() {
        this.listenTo(this.collection, 'add', this.renderNew);
        this.listenTo(this.collection, 'reset', this.renderAll);
    },
    renderAll: function() {
        // Empty your list.
        this.$el.empty(); 
        var _views = []; // Create a list for you subviews
        // Create your subviews with the models in this.collection.
        this.collection.each(function(model) {
            _views.push(new FooView({model: model});
        });
        // Now create a document fragment so as to not reflow the page for every subview.
        var container = document.createDocumentFragment();
        // Append your subviews to the container.
        _.each(_views, function(subview) {
            container.appendChild(subview.render().el);
        });
        // Append the container to your list.
        this.$el.append(container);
    },
    // renderNew will only run on the collections 'add' event.
    renderNew: function(FooModel) {
        var item = new FooView({model: FooModel});
        this.$el.prepend(item.render().$el);
    }
});