如何改变一个平坦的' observableArray使用Knockout进入嵌套的observableArray

时间:2014-03-24 01:41:46

标签: arrays knockout.js

我有一个包含3个项目的'flat'数组:

[{"title":"welcome","file":"default.aspx","category":"finance"},
{"title":"test2","file":"test2.aspx","category":"finance"},
{"title":"test1","file":"test1.aspx","category":"housing"}]

目标是将其转换为带有2个项目的嵌套observableArray:

[{"category":"finance","content":[
    {"title":"welcome","file":"default.aspx","category":"finance"},     
    {"title":"test2","file":"test2.aspx","category":"finance"}]},
{"category":"housing","content":[
    {"title":"test1","file":"test1.aspx","category":"housing"}]}]

http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html帮助我分两步提取独特的类别:

 self.getcategories = ko.computed(function () {
                        var categories = ko.utils.arrayMap(self.pages(), function (item) {
                            return item.category();
                        });
                        return categories.sort();
                    });


self.uniqueCategories = ko.dependentObservable(function() {
                        return ko.utils.arrayGetDistinctValues(self.self.getcategories()).sort();
                    });

//uniqueCategories: ["finance","housing"]

但是我无法弄清楚如何创建嵌套数组。我得到了这个:

self.createCategories = ko.computed(function () {
                         ko.utils.arrayForEach(self.uniqueCategories(), function (item) {
                            var content = getCategoryContent(item);

                            var c = new category(item, content);
                            self.Categories.push(c);
                        });

                        return true;
                    });



                    function getCategoryContent(whichcategory) {
                        return ko.utils.arrayFilter(self.pages(), function (page) {
                            return page.category() === whichcategory;

                        });
                    }

然而,它产生了5个类别项目(财务4x,住房1x),我预计只有2个。

1 个答案:

答案 0 :(得分:0)

您的计算函数createCategories可能被多次调用。例如如果要一次向一个()数组中添加一个项目,这将在每次添加项目时触发createCategories函数。

通常你会创建categories数组并从计算函数返回它。目前,您正在添加到Categories observable数组,而不是每次都清除它。

一个简单的解决方法是清除createCategories函数顶部的Categories数组。这将使您处于奇怪的情况,必须至少调用createCategories一次来设置依赖项,但之后它将在数据更改时自动工作。

另一种选择是创建一个数组并从createCategories函数返回它,然后你可以将函数重命名为Categories而不是一个可观察的数组。这将是我通常使用计算函数的方式。

更多选项是将工作作为普通的JavaScript函数(而非计算),并在更改原始数组时手动调用createCategories(例如,当您从服务器返回结果时)。