我正在尝试使用淘汰赛创建内联编辑。


我为同一字段创建了“ span”和“ input”。
单击范围时,我将隐藏范围并“显示”“输入”。
但是输入的变化并不反映在跨度上。


我的HTML栏位

<td>
    <span data-bind="text: name" style="display: inline;">Furious Lizard</span>
    <input data-bind="value: name" style="display: none;" type="text">
</td>


我的内联代码

$('td').on('click', function () {
    var spanElement = $(this).find('span');
    $(this).find('span').hide();
    $(this).find('input').show().select().on('blur', function () {
        $(this).hide();
        spanElement.show();
    });
});


为什么绑定不起作用?

JSFiddle

最佳答案

我相信原因是,即使您绑定到observableArray,对象上的属性本身也不是可观察的,因此,当属性更改时,其他绑定元素不会收到更改通知。

我已经编辑了您的示例:
http://jsfiddle.net/879Pk/3/

在那里,您可以看到数据中的第一个元素不仅是标准属性,而且也可以观察到:

{
    name: ko.observable("Well-Travelled Kitten"),
    model: ko.observable(352),
    price: 75.95
}


注意:由于您在下面将其用于计算,因此我没有修改价格。为此,您必须将所有价格修改为可观察的价格,然后在计算时实际调用可观察的价格(使用括号)以获取实际价值。

为了避免必须为每个属性手动创建可观察对象,Knockout有一个名为“ Mapping”(http://knockoutjs.com/documentation/plugins-mapping.html)的插件,该插件使用以下语法精确地做到了这一点:

var viewModel = ko.mapping.fromJS(data);


现在,关于您的第二个JSFiddle,我做了一些更正:
http://jsfiddle.net/879Pk/5/

当您添加元素时,新元素的属性是不可观察的,并且在评估price属性时也缺少括号。

09-25 17:20
查看更多