假设我有一个TabManager
类,其中包含tabs
数组。还有一个控制器需要跟踪此tabs
属性并在数组中绘制选项卡。我有两种方法来共享这些数据:
第一种方法是参考共享:
controller.tabs = tabManager.tabs
上述陈述也有很多变化,例如,这一个:
// getTabs() returns reference to private _tabs property
controller.tabs = tabManager.getTabs();
第二种方法是在标签数组更改时通知控制器:
tabManager.on("tabSetChange", function(tabs) {
// tabs here are clone of tabManager.tabs, not the same reference
// so modifying controller.tabs won't affect tabManager.tabs
controller.tabs = tabs;
});
是否有一些经验法则可以决定选择哪种方法?最近,我倾向于使用第二种方法来防止意外的数据更改,并且使用这种方法调试似乎更容易。但第二种方法也更加精细。
答案 0 :(得分:1)
从您的描述中听起来像TabManager
"拥有" tabs数组并负责对其进行更改。 controller
只需要信息的只读视图即可绘制标签。
大概controller
需要知道tabs数组何时更改,以便需要刷新视图。简单地共享引用并不能使controller
知道数组何时发生变化,TabManager必须通知它。这导致您建议更适合的事件驱动模型。
事件驱动模型允许TabManager在数组发生相关更改时以及任何关心通知的人发出事件。这种组件分离是一件好事。您可能会发现另一个组件也想要跟踪tabs数组,因此它不是硬编码与TabManager的关系,而只是注册一个事件监听器。
这种基于事件的模型非常适合JavaScript方式。