将包含observable的observableArray映射到平面数组

时间:2014-12-21 21:33:23

标签: knockout.js

有人可以告诉我如何使用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")]);

我已经arrayForEacharrayMap尝试了此操作但没有成功。我认为因为observable中包含的observableArray使操作复杂化。我认为在observable中包含observableArray可能是不好的做法(是吗?),但是更改为静态值会破坏应用程序的另一部分。

欢迎任何建议。

1 个答案:

答案 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等内部 - 我已经在视图模型上工作了,事情可以很深入地嵌套,并且感谢淘汰赛。链接,当某些东西更新时,它们都会很好地发挥作用。