【问题标题】:knockout subscribe callback not fired when using ko.mapping.fromJS使用 ko.mapping.fromJS 时未触发淘汰订阅回调
【发布时间】:2017-01-11 01:31:33
【问题描述】:

我有一个关于淘汰赛ko.mapping.fromJS 的问题。我知道ko.mapping.fromJS 只不过是让所有属性都可以观察到。但是,当我更改输入字段的值时。即使值如图所示更改,但订阅回调从未触发。任何人都可以帮助我吗? JSFiddle中的代码sn-p。

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="value: value" />
    </td>
  </tr>
  <!-- /ko -->
</tbody>
<p data-bind="text: show"></p>

js:

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

function NotesModel() {
  var self = this;
  self.notes = ko.mapping.fromJS(notes, {}, self.notes);
  self.show = ko.observable('');
};

var notesModel = new NotesModel();
ko.applyBindings(notesModel);

notesModel.notes.subscribe(function(newValue) {
   notesModel.show(JSON.stringify(newValue));
}.bind(notesModel));

【问题讨论】:

  • 我的猜测是您订阅了一个数组,但更改了数组中对象中的各个值,因此它不会触发事件

标签: javascript knockout.js


【解决方案1】:

Bindrid 是正确的。 notes 是一个数组,并且该数组没有更改,因此没有理由触发您的订阅。如果将新值推送到 notes 数组,则事件触发。您必须单独订阅每个值,或者创建一个计算来读取每个元素的值,然后订阅该计算。

【讨论】:

  • 谢谢 Jason 和 Bindrid。我尝试将新注释推送到数组并触发订阅事件。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多