我正从香草骨干移到Backbone.Marionette,我正试图用更多的木偶风格来解决一个共同的设计模式。
我有一个共同的模式,有一个子视图(子视图)可以有多个可能的状态,每个状态是一个由html和css组成的个人视图或状态。
这方面的一个例子是个人简介。
我的应用程序有一个配置文件对象,每个配置文件都有一组注释。
该配置文件将其列表显示为CompositeView(NotesView),它由集合中每个音符的ItemView(NoteView)组成。
每个NoteView都有两种可能的状态,即显示状态和编辑状态。我目前正在使用html和css完成此状态更改。在我的应用程序的其他地方,我通过在视图之间切换(破坏旧视图,创建新视图,附加新视图)来处理此设计模式。
我想要做的是为每个笔记提供两个可能的视图,NoteDisplayView和NoteEditView,然后控制由NotesView呈现的。
阅读Marionette文档后,看来交换的Marionette解决方案似乎是使用布局,区域,然后定义哪个视图显示在'由该地区。
我不清楚布局是否可以嵌入复合视图中,如果这会使复合视图的优势无效。
我显然可以编写一些自定义代码来处理这种情况,继续通过html和css管理NoteView的状态,但我想知道其他Marionette用户发现了什么样的设计模式来实现这种行为。
答案 0 :(得分:2)
我会尽力回答你的问题,尤其是这一部分:
“我想要做的是为每个音符提供两个可能的视图,NoteDisplayView和NoteEditView,然后控制由NotesView呈现的。”
这可以通过重写CompositeView
的{{1}}(我猜你使用的是Marionette 2.x,对于Marionette 1.x它的getChildView
)方法来实现,这是:
buildItemView
只需在此处添加检查(使用模型的属性)并返回所需的视图getChildView: function(child) {
var childView = this.getOption('childView') || this.constructor;
if (!childView) {
throw new Marionette.Error({
name: 'NoChildViewError',
message: 'A "childView" must be specified'
});
}
return childView;
},
或NoteDisplayView
。
更具体的例子:
让我们假设每个模型都具有属性“state”,即“display”|| “编辑”。
根据该状态,您已经知道如何呈现NotesView。
我猜如果它是可编辑的,用户可以更改它,在用户更改它并按下“保存”后,模型将被保存并且状态将被更改为显示。您的NoteEditView
会抓住模型的更改事件,并会重新呈现您的视图,但现在模型已经处于显示模式,因此将呈现CompositeView
。
希望这有帮助。