有人可以告诉我如何使用self.fThings
函数将Name
映射到包含ko.util
的平面数组吗?
function FItem(name) {
var self = this;
self.Name = ko.observable(name);
}
self.fThings = ko.observableArray([new FItem("Raindrops on roses"),
new FItem("Whiskers on kittens"),
new FItem("Bright copper kettles"),
new FItem("Warm woolen mittens"),
new FItem("Brown paper packages")]);
我已经arrayForEach
和arrayMap
尝试了此操作但没有成功。我认为因为observable
中包含的observableArray
使操作复杂化。我认为在observable
中包含observableArray
可能是不好的做法(是吗?),但是更改为静态值会破坏应用程序的另一部分。
欢迎任何建议。
答案 0 :(得分:1)
可以使用arrayForEach
(或for
循环来实现此目的):
self.plainThings = ko.computed(function() {
var ret = [];
ko.utils.arrayForEach(self.fThings(), function(item) {
ret.push(item.Name());
});
return ret;
});
您可以在正常功能中执行此操作,或者只是根据需要调用它,但在computed
内执行此操作的好处是,如果将另一项添加到{{1}中(或从{{1}中移除) }或其中一个observableArray
值发生变化,从计算出的Name
返回的普通数组绑定的任何内容也会更新。 Demo fiddle here
或者正如您所说,您也可以使用plainThings
执行此操作。这看起来像这样:
arrayMap
Demo fiddle。或者,如果您在计算中不需要它,只需直接使用内部部分:
self.plainThings = ko.computed(function() {
return ko.utils.arrayMap(self.fThings(), function(item) {
return item.Name();
});
});
我不担心将var plainArray = ko.utils.arrayMap(self.fThings(), function(item) {
return item.Name();
});
放在observable
等内部 - 我已经在视图模型上工作了,事情可以很深入地嵌套,并且感谢淘汰赛。链接,当某些东西更新时,它们都会很好地发挥作用。