3

我有一个想要传递的复杂对象ko.mapping.fromJS,我的问题是我只希望一个字段是可观察的,但根据我尝试过的方法,其他属性要么为空,要么不存在。

我在这里创建了一个 jsFiddle说明我的问题。我希望简单地复制内部对象,因为我不需要它是可观察的;考虑到我将拥有的这些数量,我不想要额外的开销。

这样做的目的是使qty可编辑,但inner.name在文本框中保持不变。这意味着一个是可观察的,而另一个不是。

如果有人有另一种不涉及映射的方法,我很想听听。我的视图模型有很多功能等,数据来自 AJAX 调用。

function viewModel() {
    var self = this;
    self.slots = ko.observableArray([]);

    self.load = function() {
        ko.mapping.fromJS(
            [
                { 'qty': 1, 'inner': { 'name': 'thing'} },
                { 'qty': 2, 'inner': { 'name': 'stuff'} }
            ],
            { 'include': ['qty'], 'ignore': ['inner.name'] },
            self.slots);
    }
};

ko.applyBindings(new viewModel());

<button data-bind="click: load">Go</button>
<ul data-bind="foreach: slots">
    <li>
        <span data-bind="text: qty"></span>&nbsp;<span data-bind="text: inner.name"></span><input data-bind="value: qty" /><input data-bind="value: inner.name" />
    </li>
</ul>
4

1 回答 1

4

您需要使用copy,而不是ignore因为您希望那里的属性是不可观察的。

而且因为您直接映射一个数组,所以映射配置变得有点复杂。

您不能copy在“根”级别上定义,因为您的数组位于根目录。因此,您必须为create项目提供一个函数,并且在 create 函数中,您现在可以指定copy项目属性的选项:

   ko.mapping.fromJS(
        [
            { 'qty': 1, 'inner': { 'name': 'thing'} },
            { 'qty': 2, 'inner': { 'name': 'stuff'} }
        ],
        {
            create: function (options) {
                return ko.mapping.fromJS(options.data, {
                    copy: ['inner.name']
                })
            }
        },
        self.slots);

演示JSFiddle。

于 2013-04-03T21:00:35.430 回答