Model view controller 更改模型中数据的最佳方式是什么?
想象一个包含一些项目的列表。 每个项目都是一部电影,包括:Model view controller 更改模型中数据的最佳方式是什么?,model-view-controller,architecture,Model View Controller,Architecture,想象一个包含一些项目的列表。 每个项目都是一部电影,包括: 标题 星级排名(1-5) “添加到我的列表”按钮 您可以留下评论的文本框 如何做: A) 项将侦听buttonClicked事件,然后调用模型上的方法: onClick: function(event){ this.model.addToMyList(); } 无需指定电影ID,因为“模型”用于此项目。在其他情况下,模型适用于所有项目 B列表将侦听要分派buttonClicked事件的项,从事件中获取数据,并将调用模型上的
- 标题
- 星级排名(1-5)
- “添加到我的列表”按钮
- 您可以留下评论的文本框
- A) 项将侦听buttonClicked事件,然后调用模型上的方法:
无需指定电影ID,因为“模型”用于此项目。在其他情况下,模型适用于所有项目onClick: function(event){ this.model.addToMyList(); }
- B列表将侦听要分派buttonClicked事件的项,从事件中获取数据,并将调用模型上的方法:
model.addToMyList(movieId)
model.addToMyList(movieId)
- C列表将侦听某个项目以分派buttonClicked事件,此事件将执行该项目的索引(不是电影的id),然后使用列表上的索引查找电影id,并将调用模型上的方法:
model.addToMyList(movieId)
model.addToMyList(movieId)
- 您没有提到任何语言,因此我将给出一个语言中立的回答
不建议使用C:通过列表中的索引标识项目似乎是一个简单的选择,但任何扩展功能或可维护性都可能在以后变得混乱(突然对列表排序,让用户过滤列表等)
考虑到可维护性(不是先发制人的设计,而是更能适应变化的设计),事件处理程序最好能够识别正在处理的内容。这样,您就可以修改将应用于所有项目的处理程序
对于B:对于更改的集合,我会保留更多,以便控件/组件侦听集合更改(例如INotifyCollectionChangedin.net)。因此,很难说不知道您是否希望对这个集合执行特定的操作,但除非集合(作为数据模型)的更改决定了其他方面,否则它不是我的首选
因此,考虑到上述情况,(这听起来像是A-B混合,但它是一种常用的解决方案):创建的新项注册到事件处理程序(只需编写一个事件处理程序),并传入对项行本身的引用或标识符。因此,如果可能的话,您将看到:
onClick: function(MyEvent e)
{
this.model.addToMyList(e); //or this.model.addToMyList(e.ID)
}
因此,您有多个项目注册同一事件,需要维护一个事件处理程序,并且能够在您的列表通过过滤器、排序等更改时保留处理功能。您能否澄清“最佳”是什么意思?灵活(可重用)和性能良好问题。我对此一无所知,但答案也会对我有所帮助——特别是重用性这一关键问题。