如何使用 foreach 绑定从 select 选项传递参数以触发和过滤数组可观察对象

How to pass an argument from select options to trigger and filter array observables using foreach binding

在下面的标记中,我绑定了包含 Continents 列表的唯一数据:我还订阅了 selected 值并使用大洲 select 由用户编辑。

<div id="country-collection">
    <select data-bind="options: UniqueContinent,
    value: SelectedContinent"></select>
</div>

代码:

    self.CountryData = ko.observableArray([]);
    self.SelectedContinent = ko.observable('');

    self.UniqueContinent = ko.dependentObservable(function() {
        var continent = ko.utils.arrayMap(self.CountryData(),

            function(item){

                return item.Continent
            })

        return ko.utils.arrayGetDistinctValues(continent).sort();
    });

每次生成 selection 时都会触发以下函数:

    self.SelectedContinent.subscribe(function (selectedValue) {
      // alert(selectedValue);
    });

使用上面的代码,我需要使用基于默认大陆 onload 或 selected 大陆的所有国家/地区填充以下列表:因此,如果亚洲是 selected,显示的唯一国家是亚洲国家及其各自的详细信息。

<div id="country-list">
    <ul data-bind= "foreach: CountryData">
        <li><span data-bind="text: Country"></span></li>
        // More list stuff here (removed for brevity)
    </ul>
</div>

我试过了,但只有在值被硬编码时它才有效。我需要根据默认值或 select 选项的 selected 值加载国家/地区:

    self.SelectedContinent.subscribe(function (selectedValue) {

        // Call this function when changes are made
        self.FilteredEntries = ko.computed(function() {

            return ko.utils.arrayFilter(self.CountryData(), function(item) {
                // I need to use the selected value
                return item.Continent === 'SOUTH AMERICA';
        });
    });
});

您可以取消订阅功能:

    // Call this function when changes are made
    self.FilteredEntries = ko.computed(function() {

        return ko.utils.arrayFilter(self.CountryData(), function(item) {
            // I need to use the selected value
            return item.Continent === self.SelectedContinent();
        });
    });

使用订阅,每次选择更改时,您都会创建一个新的计算可观察对象,并且重新分配的计算可观察对象永远不会绑定到 DOM。

您可以在 fiddle 中查看工作演示。

您可以使用 awsome Knockout Projections plugin, available here; knockout-projections

定义过滤后的数组observable非常简单,实现效率很高:

var FilteredCountries = self.CountryData().filter(
   function(c) { return c.Continent === self.SelectedContinent(); 
});