Marionette Backbone:具有多种可能视图状态的Childviews

时间:2014-10-02 19:31:34

标签: javascript backbone.js view marionette

我正从香草骨干移到Backbone.Marionette,我正试图用更多的木偶风格来解决一个共同的设计模式。

我有一个共同的模式,有一个子视图(子视图)可以有多个可能的状态,每个状态是一个由html和css组成的个人视图或状态。

这方面的一个例子是个人简介。

我的应用程序有一个配置文件对象,每个配置文件都有一组注释。

该配置文件将其列表显示为CompositeView(NotesView),它由集合中每个音符的ItemView(NoteView)组成。

每个NoteView都有两种可能的状态,即显示状态和编辑状态。我目前正在使用html和css完成此状态更改。在我的应用程序的其他地方,我通过在视图之间切换(破坏旧视图,创建新视图,附加新视图)来处理此设计模式。

我想要做的是为每个笔记提供两个可能的视图,NoteDisplayView和NoteEditView,然后控制由NotesView呈现的。

阅读Marionette文档后,看来交换的Marionette解决方案似乎是使用布局,区域,然后定义哪个视图显示在'由该地区。

我不清楚布局是否可以嵌入复合视图中,如果这会使复合视图的优势无效。

我显然可以编写一些自定义代码来处理这种情况,继续通过html和css管理NoteView的状态,但我想知道其他Marionette用户发现了什么样的设计模式来实现这种行为。

1 个答案:

答案 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

希望这有帮助。