Backbone.js 提线木偶收集视图:如何检查是否因为“已添加项目”;重置";或;加上“;?
我正在使用木偶的Backbone.js 提线木偶收集视图:如何检查是否因为“已添加项目”;重置";或;加上“;?,backbone.js,marionette,Backbone.js,Marionette,我正在使用木偶的CollectionView来呈现带有ItemViews的项目列表。每当添加新项目时,我都希望在动画中运行一个短暂的淡入淡出。但不是在最初呈现集合(或重置集合)时 在使用木偶之前,我处理reset和add事件的方式略有不同,但我不知道如何在这里执行此操作。我查看了源代码,似乎addItemView负责添加子视图,并且addChildView(在集合上触发add时调用)和render(对于reset事件)都调用此方法 也许我遗漏了一些明显的东西。我认为最好的选择是在呈现Collec
CollectionView
来呈现带有ItemViews
的项目列表。每当添加新项目时,我都希望在动画中运行一个短暂的淡入淡出。但不是在最初呈现集合(或重置集合)时
在使用木偶之前,我处理reset
和add
事件的方式略有不同,但我不知道如何在这里执行此操作。我查看了源代码,似乎addItemView
负责添加子视图,并且addChildView
(在集合上触发add
时调用)和render
(对于reset
事件)都调用此方法
也许我遗漏了一些明显的东西。我认为最好的选择是在呈现CollectionView后绑定事件
myCollectionView.on( "render", function() {
this.on( "after:item:added", executeMyAnimation );
});
我认为最好的选择是在呈现CollectionView之后绑定事件
myCollectionView.on( "render", function() {
this.on( "after:item:added", executeMyAnimation );
});
这是一种方法: 在您的
CompositeView
声明中包括这些函数:
onBeforeRender: function(){
this.onBeforeItemAdded = function(){};
},
onRender: function(){
this.onBeforeItemAdded = myAnimation;
}
这类似于我在《木偶》一书中提出的解决方案()
工作原理:木偶网在渲染整个集合之前会触发“before:render”,因此可以将onBeforeItemAdded
函数设置为不执行任何操作。渲染集合后,设置该函数以设置新项目视图的动画
由于每次集合视图添加项目视图时,它也会触发“before:item:added”,因此您可以定义一个onBeforeItemAdded
函数,该函数将在触发该事件时自动调用。这种匹配是由于triggerMethod实现的
此解决方案可以解决您的问题,而无需在模型上添加标志。这是一种方法: 在您的
CompositeView
声明中包括这些函数:
onBeforeRender: function(){
this.onBeforeItemAdded = function(){};
},
onRender: function(){
this.onBeforeItemAdded = myAnimation;
}
这类似于我在《木偶》一书中提出的解决方案()
工作原理:木偶网在渲染整个集合之前会触发“before:render”,因此可以将onBeforeItemAdded
函数设置为不执行任何操作。渲染集合后,设置该函数以设置新项目视图的动画
由于每次集合视图添加项目视图时,它也会触发“before:item:added”,因此您可以定义一个onBeforeItemAdded
函数,该函数将在触发该事件时自动调用。这种匹配是由于triggerMethod实现的
此解决方案应该可以解决您的问题,而无需在模型上添加标志。David Sulc的答案非常粗糙,fadeIn应该在项目本身中定义,而不是在父视图中定义。 另一件事是文档中没有提到onBeforeItemAdded(),因此它可能是供内部使用的,并且可能会随着时间的推移而改变 我建议在“父视图”中添加以下内容,注意:parentRendered标志:
itemViewOptions: function() {
return {
collection: this.collection,
parentRendered: this.rendered
};
},
onRender: function() {
this.rendered = true;
}
并在项目视图内的onShow函数中使用该标志:
onShow: function() {
// show visual effect on newly added items
if (this.options.parentRendered) {
this.$el.css('opacity', 0).slideDown(200).animate(
{ opacity: 1 },
{ queue: false, duration: 400 }
);
}
else {
this.$el.show();
}
}
David Sulc的答案很粗糙,fadeIn应该在item-it-self中定义,而不是在父视图中定义。 另一件事是文档中没有提到onBeforeItemAdded(),因此它可能是供内部使用的,并且可能会随着时间的推移而改变 我建议在“父视图”中添加以下内容,注意:parentRendered标志:
itemViewOptions: function() {
return {
collection: this.collection,
parentRendered: this.rendered
};
},
onRender: function() {
this.rendered = true;
}
并在项目视图内的onShow函数中使用该标志:
onShow: function() {
// show visual effect on newly added items
if (this.options.parentRendered) {
this.$el.css('opacity', 0).slideDown(200).animate(
{ opacity: 1 },
{ queue: false, duration: 400 }
);
}
else {
this.$el.show();
}
}
这适用于
CollectionView
,但不适用于我出于其他原因使用的CompositeView
<代码>复合视图在集合重置时不会完全重新呈现自身,而仅重新呈现集合的项目视图。在我的应用程序中设置的方式是,首先使用空集合呈现视图,然后获取(并重置)CompositeView
有一个事件composite:collection:rendered
,但没有“before”,因此我无法禁用动画回调。最后我在模型上加了一个“animate”标志。这在CollectionView
中很好用,但在CompositeView
中就不行了,因为其他原因,我最终使用了CompositeView
<代码>复合视图在集合重置时不会完全重新呈现自身,而仅重新呈现集合的项目视图。在我的应用程序中设置的方式是,首先使用空集合呈现视图,然后获取(并重置)CompositeView
有一个事件composite:collection:rendered
,但没有“before”,因此我无法禁用动画回调。最后,我在模型上挂了一个“动画”标志。这太棒了!值得一提的是,项目视图是onBeforeItemAdded
中的第一个参数,因此您可以调用view.on('show',myAnimation)
以获得更平滑的结果。这太棒了!值得补充的是,项目视图是onBeforeItemAdded
中的第一个参数,因此您可以调用view.on('show',myAnimation)
,以获得更平滑的结果。