我想要一个Marionette ItemView(或LayoutView),它在模型更改时会重新渲染。它实际上很容易实现:
modelEvents: {
'change': 'render'
}
但是,并非每个视图都显示模型的每个属性。所以我想通过只听那些改变一些属性的事件来减少重新渲染的数量。如果视图只需要一个属性,情况也很简单:
modelEvents: {
'change:attribute': 'render'
}
但是,如果需要监听多个属性更改,则会更复杂。两者
modelEvents: {
'change:attribute1': 'render',
'change:attribute2': 'render'
}
和
modelEvents: {
'change:attribute1 change:attribute2': 'render'
}
如果在一个事件中更改了attribute1和attribute2,将重新呈现视图两次。是否有任何简单的语法只能在这种情况下通知一次?我知道,我可以这样做:
modelEvents: {
'change': 'checkIfRenderNeeded'
},
checkIfRenderNeeded: function(event) {
if (('attribute1' in event.changed) || ('attribute2' in event.changed)) {
this.render();
}
}
但是有更优雅的解决方案吗?也许一些特殊的语法在modelEvents属性中包含此行为,而不必在常规更改事件侦听器上编写更改检查器?
答案 0 :(得分:3)
与Paul Rowe相同的解决方案,但在Marionette的背景下:
您可以使用Underscore的_.debounce函数来包装render
函数:
var lazyRender = _.debounce(render, 50)
和
modelEvents: {
'change:attribute1 change:attribute2': 'lazyRender'
}
然后,如果attribute1
和attribute2
在50毫秒的时间内改变,甚至几次,lazyRender
将被多次调用,但render
函数只会被调用被召唤一次。
答案 1 :(得分:0)
我对木偶不熟悉,但我会从自己的经历中拉出一页。
设置一个作为渲染前端的函数。所有渲染尝试都通过此功能。此函数管理一个计时器,该计时器在完成时触发渲染功能。每当调用该函数时,它都会清除计时器,因此没有排队的请求进行渲染。然后重置计时器。