【问题标题】:What is the best way to change data in a model?更改模型中数据的最佳方法是什么?
【发布时间】:2011-08-16 14:13:32
【问题描述】:

想象一个包含一些项目的列表。 每个项目都是一部电影,包括:

  • 标题
  • 星级排名(1-5)
  • 添加到我的列表按钮
  • 您可以发表评论的文本框

怎么做:

  • A) item 将监听 buttonClicked 事件,然后调用模型上的方法:

    onClick: function(event){
       this.model.addToMyList();
    }
    

    不需要指定movieId,因为“模型”是针对这个项目的。在其他情况下,模型适用于所有项目。

  • B list 将监听一个项目以调度 buttonClicked 事件,从该事件中获取数据,并将调用模型上的方法:

    model.addToMyList(movieId)
    
  • C list会监听一个item去派发buttonClicked事件,这个事件会进行item的index(不是电影的id),然后找到movieId 使用列表中的索引,并将调用模型上的方法:

    model.addToMyList(movieId)
    

【问题讨论】:

  • 你能解释一下你所说的“最好”是什么意思吗?
  • 灵活(可重复使用)和性能
  • 好问题。我对此一无所知,但答案也会对我有所帮助——尤其是可重用性的关键问题。

标签: model-view-controller architecture


【解决方案1】:

你没有提到任何语言,所以我将给出一个语言中立的回应。

不推荐 C:通过列表中的索引识别项目似乎是一个简单的选择,但任何扩展功能或可维护性在以后可能会变得混乱(突然订购列表、让用户过滤列表等)。

考虑到可维护性(不是先发制人的设计,而是更适应变化的设计),最好让事件处理程序能够识别正在处理的内容。这样,您可以修改将应用于所有项目的处理程序。

对于 B:我将更多保留用于更改的集合,目的是控件/组件正在侦听集合更改(例如 INotifyCollectionChangedin .net)。因此,很难说不知道您是否要对这个集合执行特定操作,但它不是我的首选,除非集合(作为数据模型)的变化决定了其他方面。

因此,考虑到上述情况,(这听起来像是 A-B 混合,但它是一种常用的解决方案):创建的新项目被注册到事件处理程序(只需代码 one 事件处理程序) , 并传入对 item-row 本身的引用或标识符。所以,如果可能的话,你会看:

onClick: function(MyEvent e)
{
   this.model.addToMyList(e); //or this.model.addToMyList(e.ID)
}

因此,您有多个项目注册同一个事件,需要维护一个事件处理程序,并且如果您的列表通过过滤器、排序等发生更改,您可以保留该处理程序。

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 2016-06-14
    • 2015-10-09
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多