【问题标题】:KnockoutJS: How to add one observableArray to another?KnockoutJS:如何将一个 observableArray 添加到另一个?
【发布时间】:2012-04-03 05:58:27
【问题描述】:

我想将选择元素中的选定选项添加到绑定表。视图模型具有 addItem 函数,该函数使用 ko.utils.arrayPushAll() 将 selectedItems 数组添加到 addedItems 数组中。但是当我点击 Add 按钮(调用 addItem 函数)时什么也没有发生。如何正确地将一个可观察数组添加到另一个?

HTML

<label>Parameter list</label>
<br/>
<select multiple="multiple" 
        data-bind="options: items, selectedOptions: selectedItems, optionsText: 'name', optionsValue: 'id'">
</select>
<p>
    <button data-bind="click: addItem, enable: selectedItems().length > 0">Add</button>
</p>

<label>Selected parameters</label>
<br/>
<table data-bind="visible: addedItems().length > 0">
    <thead>
        <tr>
            <th>Name</th>
            <th>Value</th>
            <th />
        </tr>
    </thead>
    <tbody data-bind="foreach: addedItems">
        <tr>
            <td>
                <input type="hidden" data-bind="value: id"/>
                <span data-bind="text: name" /> 
            </td>
            <td><input type="text" data-bind="value: value" /></td>
            <td><a href="#" data-bind="click: $root.removeItem">Remove</a></td>
        </tr>
    </tbody>
</table>

JavaScript

​var dataSource = [
    new Parameter({ id: "1", name: "param1", value: "" }),
    new Parameter({ id: "2", name: "param2", value: "" }),
    new Parameter({ id: "3", name: "param3", value: "" })
    ];

function Parameter(data) {
    this.id = ko.observable(data.id);
    this.name = ko.observable(data.name);
    this.value = ko.observable(data.value);
}

function ParameterSelectList() {
    // Data
    var self = this;
    self.items = ko.observableArray(dataSource);
    self.selectedItems = ko.observableArray([]);
    self.addedItems = ko.observableArray([]);

    // Operations
    self.addItem = function() {
        ko.utils.arrayPushAll(self.addedItems, self.selectedItems);
        self.items.removeAll(self.selectedItems);
    };
    self.removeItem = function(item) {
        self.items.push(item);
        self.addedItems.remove(item);
    };
}

ko.applyBindings(new ParameterSelectList());​

现场示例 - http://jsfiddle.net/6H2PK/7/

更新:删除选定项目的工作示例 - http://jsfiddle.net/ebash/xxNak/

【问题讨论】:

    标签: javascript binding knockout.js html-select ko.observablearray


    【解决方案1】:

    这里发生了一些事情:

    1) 您正在使用 'optionsValue' 绑定,因此 selectedItems 只会包含一个 id 列表

    2) arrayPushAll 适用于“本机”数组,而不是 observableArrays。您仍然可以使用 self.addedItems() 和 self.selectedItems() 表单来完成这项工作,但是您需要调用 self.addedItems.valueHasMutated() 让订阅者知道更改。

    3) removeAll 接受“本机”数组参数,而不是 observableArray。

    这是一个有效的最终小提琴:

    http://jsfiddle.net/jearles/6H2PK/8/

    【讨论】:

    • 非常感谢。但是我有一个问题:为什么“removeAll”函数是“native”的? self.items.removeAll(self.selectedItems());从
    • 我所说的“native”是指它需要一个标准的 JavaScript 数组(而不是 observableArray——就像所有的 observable 一样,它是一个函数)。对于传入数组中的每个元素,它将从 self.items observableArray 中删除相同的项目(如果存在)。 observableArray 通知所有订阅者它已更改,这会导致 select 元素重新呈现。
    • removeAll 不是“本机”函数 - knockoutjs.com/documentation/observableArrays.html
    • 是的,我知道这是一个 Knockout 函数。我不是在谈论函数......我在谈论你传递给它的参数。你不能说:observableArray1.removeAll(observableArray2)。你不得不说:observableArray1.removeAll(observableArray2()) - 返回底层的“原生”JavaScript 数组。
    • 哦...我终于明白了。谢谢
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多