如果多个模型属性同时更改,是否有可能只收到一次通知?

时间:2015-03-04 14:36:28

标签: javascript marionette

我想要一个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属性中包含此行为,而不必在常规更改事件侦听器上编写更改检查器?

2 个答案:

答案 0 :(得分:3)

与Paul Rowe相同的解决方案,但在Marionette的背景下:

您可以使用Underscore的_.debounce函数来包装render函数:

var lazyRender = _.debounce(render, 50)

modelEvents: {
  'change:attribute1 change:attribute2': 'lazyRender'
}

然后,如果attribute1attribute2在50毫秒的时间内改变,甚至几次,lazyRender将被多次调用,但render函数只会被调用被召唤一次。

答案 1 :(得分:0)

我对木偶不熟悉,但我会从自己的经历中拉出一页。

设置一个作为渲染前端的函数。所有渲染尝试都通过此功能。此函数管理一个计时器,该计时器在完成时触发渲染功能。每当调用该函数时,它都会清除计时器,因此没有排队的请求进行渲染。然后重置计时器。