Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 淘汰/MVVM设计问题_Javascript_Design Patterns_Mvvm_Knockout.js - Fatal编程技术网

Javascript 淘汰/MVVM设计问题

Javascript 淘汰/MVVM设计问题,javascript,design-patterns,mvvm,knockout.js,Javascript,Design Patterns,Mvvm,Knockout.js,在使用KnockoutJS框架和MVVM时,我一直在努力解决一个问题。有时,集合中某个特定项的属性发生更改,并且由于该更改,我需要影响该集合中的所有其他项。在所有语言和模式中,对象都不应该“知道”它所在的集合的任何信息,但我发现自己经常需要打破这一规则,以使某些类型的逻辑正常工作 我已经创造了一个我正在谈论的人为的例子,来展示我一直在解决这个问题的黑客方式。我希望有经验的人能参与进来,告诉我更好的方法 我不知道这是否是“推荐”的方法,但我会就如何解决这个问题提供建议。我不是一个MVVM专家(尽管

在使用KnockoutJS框架和MVVM时,我一直在努力解决一个问题。有时,集合中某个特定项的属性发生更改,并且由于该更改,我需要影响该集合中的所有其他项。在所有语言和模式中,对象都不应该“知道”它所在的集合的任何信息,但我发现自己经常需要打破这一规则,以使某些类型的逻辑正常工作

我已经创造了一个我正在谈论的人为的例子,来展示我一直在解决这个问题的黑客方式。我希望有经验的人能参与进来,告诉我更好的方法


我不知道这是否是“推荐”的方法,但我会就如何解决这个问题提供建议。我不是一个MVVM专家(尽管我已经编写了很多击倒JS的应用程序),但我认为一些OOP原则在这里会非常有用

首先让我们讨论一下目前的情况。。。 正如您正确观察到的那样(击倒双关语是无意的!),您的方法并不理想。
Person
对象不仅知道它们的兄弟姐妹(即使是通过订阅间接知道),还知道它们订阅的父对象。
Person
类型订阅了父对象上的更改。这不仅会使您的
Person
对象在此场景之外无法使用,还会给每个实例带来太多的责任(违反单一责任原则),并且每个实例都订阅了其他每个实例上的更改,这当然是浪费

那么解决办法是什么呢? 对我来说,放置这种逻辑的理想位置是父对象(即视图模型)。您的视图模型已经知道它的子对象,所以为什么不将功能放在那里呢?这将使您的
Person
类型可在其他地方重用(好的,因此它具有可观察性,因此目前它与KO绑定,但这可以通过映射插件来克服),并解除它管理其兄弟的责任

但这仍然意味着父级和子级之间存在紧密耦合,而不是我们在OOP中想要的!为了克服这一问题,您可以采用发布/订阅(观察者)模式,并让您的
人员
在发生变化时发布消息,然后您可以让订阅者(例如,您查看模型)决定如何响应此事件。您也不必使用knockout的发布/订阅产品,任何发布/订阅实现都可以。虽然您也可以利用KO提供的功能,但我会为您指出这些扩展/帮助的方向,以稍微简化一些事情:


希望我能提供帮助:)

除非我误解了您的场景,否则您可以使用动态自动更新的
计算的
观测值

首先,我认为每个人的“未成年”财产标志只是他们的年龄与最低年龄的比较。e、 g.19

其次,您还可以使用
computed
observable为所有用户执行聚合标志

最后,我不一定同意这是父母/孩子的关系。这些只是特定于页面的视图模型的属性

看看这个例子,它在这两种情况下都使用computed。