如何用ko.computed提取部分knockoutArray

时间:2013-12-29 14:32:54

标签: javascript jquery mvvm knockout.js

我有一个淘汰阵列:

Tags = ko.observableArray()

填充了Tag-objects:

Tag = function(data){
    var self = this; 

    self.Id = data.Id;
    self.Name = ko.observable(data.Name);
    self.Type = ko.observable(data.Type);
    self.ParentTextId = data.TextId; 
}

标签属于文本对象:

Text = function(data){
    var self = this; 

    self.TextId = data.TextId;
    self.Title = ko.observable(data.Title);

    **self.Tags = ko.observableArray();**

    self.TagsOfType1 = ko.computed( function () { 

        //???

    } );

    self.TagsOfType2 = ko.computed( function () { ??? } );
    self.TagsOfType3 = ko.computed( function () { ??? } );

}

使用$ .getJSON查询到数据库的结果创建Tag和Text对象的新实例。获得标签后。我根据他们的“ParentTextId”分配标签。

事情是:我需要为我的文本添加每个Tag.Type的数组,并认为这必须可以与Text-object上的ko.computed函数一起使用,因为这样可以更容易地处理“isDirty”原型属性。

但是我应该如何设置计算函数?

(预先感谢您提供任何帮助。)

1 个答案:

答案 0 :(得分:2)

您可以使用ko.utils.arrayFilter method按类型(或任何其他谓词)过滤Tags数组。

然后我会创建一个帮助函数,它接受一个TagType并返回包含过滤的计算结果:

self.Tags = ko.observableArray();

function createTypeComputed(tagType){
    return ko.computed(function() {
        return ko.utils.arrayFilter(self.Tags(), function(item) {
            return item.Type() == tagType;
        });
    });
}

self.TagsOfType1 = createTypeComputed('tagtype1');
self.TagsOfType2 = createTypeComputed('tagtype2');
self.TagsOfType3 = createTypeComputed('tagtype3');

如果你还有一套TagType的修正集,你甚至可以缩短它,并在一个循环中调用createTypeComputed动态定义你的TagsOfType1,TagsOfType2等属性。