javascript - View 模型在保存或文本输入时未更新

标签 javascript knockout.js knockout-mapping-plugin

这很可能是一个简单的修复,但我在这里用头撞墙。所以我收到了来自服务器的 JSON 响应,我将其发送到我的 View 模型 ko.mapping 。数据绑定(bind)到输入文本字段。但是 View 模型没有更新。

我期望的是,如果输入文本字段已更新, View 模型已更新,并且 <p>在其上方更新(绑定(bind)到同一字段)。

关于为什么我的 View 模型没有更新有什么想法吗?

JSON 响应

{
  "notes": [
    {
      "key": "Field1",
      "value": "Progress"
    },
    {
      "key": "Field2",
      "value": "Plan"
    }
  ]
}

HTML

<tbody>
    <!-- ko foreach: notes -->
    <tr>
        <td class="col-xs-12">
            <p data-bind="text: value()"></p>
            <input type="text" class="form-control" data-bind="textInput: value()" />
        </td>
        <td class="col-xs-12">
            <!-- ko ifnot:editingItem-->
            <a class="btn btn-default btn-sm pull-right" data-bind="click: $parent.editRow">Edit</a>
            <!-- /ko -->
            <!-- ko if:editingItem-->
            <a class="btn btn-default btn-sm pull-right" data-bind="click: $parent.stopEdit">Cancel</a>
            <!-- /ko -->
        </td>
    </tr>
    <!-- /ko -->
</tbody>

JS

 var mapping = {
    'notes': {
        create: function (item) {
            // console.log(item);
            return new Note(item.data.key, item.data.value, false);
        }
    }
 }

 function Note(key, value, editing) {
    this.key = key;
    this.value = ko.observable(value);
    this.editingItem = ko.observable(editing);
 }

 function NotesModel() {
    var self = this;
    self.notes = ko.observableArray([]);
    self.Save = function () {
        console.log(ko.toJSON(self));
    };
    self.editRow = function (item) {
        //Stop editing other rows
        $.each(self.notes, function (i, v) {
            v.editingItem(false);
        });
        item.editingItem(true);
    }
    self.stopEdit = function (item) {
        item.editingItem(false);
    }
 };
 var notesModel = new NotesModel();
 ko.mapping.fromJS(data, mapping, notesModel);
 ko.applyBindings(notesModel, $('#CIR_NotesFields')[0]);

最佳答案

将绑定(bind)从“textInput”更新为仅值,并从“

”绑定(bind)中删除显式可观察引用,就像下面的标记一样。

<tbody>
    <!-- ko foreach: notes -->
    <tr>
        <td class="col-xs-12">
            <p data-bind="text: value"></p>
            <input type="text" class="form-control" data-bind="value: value" />
        </td>
        <td class="col-xs-12">
            <!-- ko ifnot:editingItem-->
            <a class="btn btn-default btn-sm pull-right" data-bind="click: $parent.editRow">Edit</a>
            <!-- /ko -->
            <!-- ko if:editingItem-->
            <a class="btn btn-default btn-sm pull-right" data-bind="click: $parent.stopEdit">Cancel</a>
            <!-- /ko -->
        </td>
    </tr>
    <!-- /ko -->
</tbody>

https://jsfiddle.net/c9t1oagv/

关于javascript - View 模型在保存或文本输入时未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33084373/

相关文章:

javascript - 使用挖空绑定(bind)在网页中显示图像

javascript - CSS 无法对 Knockout 绘制的表格应用 dark-stripe 和 light-stripe

memory-leaks - KnockoutJS 内存泄漏

javascript - 在knockout js中applybind之后添加新属性到 View 模型

javascript - 使用 Javascript 更改 html 可见性

javascript - 专门支持测试异步代码的 node.js 单元测试框架?

javascript - 在 JavaScript ES6 中,for-in 循环和 for-of 循​​环中,变量 i 在 block 的每次迭代后不再存在?

javascript - 在javascript中从 Controller MVC获取json

knockout.js - 带有选项组的 Knockoutjs 选择

javascript - 从 Knockoutjs 中的 observablearray 中删除项目