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