问题:
我在屏幕上有3个UI组件:
Top menu's Option
的值。其内容取决于所选的Left menu's item
。例如,A选中将显示2个输入框,而B显示3个输入框等... 它的工作方式是用户将选择左侧菜单项,然后单击顶级菜单的选项,表格内容将显示。
热门菜单有TopMenu
型号
{
isSelected: false
}
左侧菜单有LeftMenuCollection
,其中包含此类型号
{
id: 0
label: "No label yet"
}
表单内容的FormContentModel
太长,无法放入此处。
对TopMenuView
和LeftMenuView
我有2个观看次数:TopMenu
和LeftMenuCollection
。但是,表单内容视图的视图(让我们调用FormContentView
)必须从TopMenu
和LeftMenuCollection
获取值,以便知道何时可见并且<可见后显示的强>什么。
当前的想法:
用户对LeftMenuView
的操作将触发事件,FormContentView
将根据所选内容在隐藏的DOM中填充HTML。
TopMenuView
会触发FormContentView
可见。
然后FormContentView
将保存到自己的FormContentCollection
。
对于#1和#2,我只是使用了像这里的PubSub模型:fire an event from one view to another in backbone
但是因为我使用Backbone Boilerplate https://github.com/tbranyen/backbone-boilerplate。我打算这样做是因为app对象已经在app.js中创建了:
app.PubSub = _.extend({}, Backbone.Events)
问题:
我如何以及在何处创建该PubSub对象?它在router.js中吗?
PubSub是正确的方法吗?通过将TopMenu
和LeftMenuCollection
合并到另一个FormContentCollection
下,我也在考虑“复合模型”,但互联网上的大多数人都说使用了PubSub。
答案 0 :(得分:2)
定义“app”变量后立即创建pubsub。
我更喜欢将PubSub直接附加到Backbone对象,我在骨干加载后立即执行。 (我之前写过:Backbone.js global notifications)
这是另一个可能更简单的想法:
创建一个新模型并在所有视图之间共享。
(请注意,您可以向视图添加第二个模型,不必将它们设置为view.model)
Left和Top视图可以.set()其属性,Form视图可以使用.on('change',function ...)绑定到更改,并通过显示/隐藏视图进行响应。