淘汰foreach基于另一个可观察的

时间:2014-06-03 21:37:16

标签: knockout.js ko.observablearray

我有一个可观察的,几个可观察的数组。我想迭代这些可观察数组,具体取决于我有什么可观察数据。听起来多么神秘。如果是,那么fiddle会使它变得非常简单

function VM(){
    var self = this;
    this.type1 = ko.observableArray(['Hello', 'this', 'is', 'first', 'array']);
    this.type2 = ko.observableArray(['Second', 'Array']);
    this.type3 = ko.observableArray(['hohoho', 'hahaha']);

    this.type = ko.observable('type1')

    this.setType = function(t){
        self.type(t);
    }
}

ko.applyBindings(new VM())

因此,根据我点击的按钮,我希望迭代不同的数组。

<button data-bind="click: function(){setType('type1')}">Type1</button>
<button data-bind="click: function(){setType('type2')}">Type2</button>
<button data-bind="click: function(){setType('type3')}">Type3</button>

<div data-bind='text: type'></div><br>

<ul data-bind="foreach: type1">
    <li data-bind="text: $data">
</ul>

如您所见,单击按钮会更改observable,但我无法更改将要迭代的数组。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

一种方法是使用计算...

this.selectedType = ko.computed(function() {
    return self[self.type()]();
});

<ul data-bind="foreach: selectedType">
    <li data-bind="text: $data">
</ul>

Fiddle

答案 1 :(得分:1)

修改您的ul,如下所示:

<ul data-bind="foreach: $root[type()]">
    <li data-bind="text: $data">
</ul>

$rootknockout提供,并引用最初指定给ko.applyBindings来电的对象。