【发布时间】:2012-07-09 09:39:42
【问题描述】:
我正在使用 Knockout.js 创建一个客人列表应用程序,到目前为止一切进展顺利。但是,我有一个最佳实践问题。我的应用程序有几种不同类型的对象:客人和标签。客人可以有多个标签,标签可以有多个客人。在应用程序的不同点,我需要分别显示两个数组。例如,我有一个“客人”视图,可以看到所有客人及其关联的标签,我还有一个“标签”视图,可以看到所有标签及其关联的客人。目前,我为客人添加标签的代码如下所示:
var tag = function(opts) {
this.guests = ko.observableArray()
// Other tag code here...
}
var guest = function(opts) {
this.tags = ko.observableArray()
// Other guest code here...
var self = this
this.addTag = function(tag) {
self.tags.push(tag)
tag.guests.push(self)
}
}
我知道除了独立更新每个 observableArray 之外,在 Knockout 中必须有更好的方法来处理这种多对多关系。这也导致了一种递归应用程序结构,其中客人有一个标签属性/数组,其中包含一个标签,它有一个客人属性/数组,其中包含一个客人,它有一个标签属性......你明白了。
现在,ViewModel 结构是这样的:
- Parent Object
- Guests ObservableArray
- Guest Object
- Tag Object as property of Guest
- Tags ObservableArray
- Tag Object
- Guest Object as property of Tag
所以我想我的问题是双重的:1) 有没有更好的方法来构造我的 ViewModel 以避免递归数组?和 2) 如何更好地使用 Knockout.js 以 DRY 方式更新我的 ViewModel,而不是单独更新 tags 数组和 guest 数组?谢谢!
【问题讨论】:
-
我的回答有问题吗?如果您让我知道出了什么问题,我可以尝试改进它。
-
嘿 Tyrsius,我喜欢这个答案,这就是我投票的原因,但我觉得它并没有完全解决结构问题。我同意保存 ID 并使用计算函数进行查找比保存完整对象更好,但是如果我使用许多不同的 Guest 和 Tags 实例,每个实例都需要能够遍历它们各自的关联,我该怎么做在你的模型中这样做?目前,您的答案似乎只有在我想一次遍历一个对象时才有效。对不起,如果我太挑剔了,这有点新。
-
所以,我不完全确定你的意思。您想一次查看多个“selectedTags”吗?顺便说一句,挑剔很好。你有一个特定的问题,你需要帮助。挑剔=)
-
是的,你可以这样说。我需要同时为每位客人提供“selectedTags”视图。不同之处在于,在您的模型中,我一次选择一个客人或标签,因此您可以在父 ViewModel 上创建“selectedGuests”和“selectedTags”。但是,如果我想一次显示多个客人,每个客人都有自己的标签列表,并且一次显示多个标签,每个标签都有自己的客人列表,我应该如何构建内容以便我可以轻松更新两者?谢谢!
-
是的,这确实需要不同的视图模型。我给你煮点东西。
标签: javascript mvvm knockout.js knockout-mapping-plugin