4

カスタム バインディングで、データをモデルに書き戻すことができません。問題は、「書き込み可能な」プロパティに書き込む方法がないことです。

ノックアウト 2 では使用する可能性がありましたがallBindingsAccessor()._ko_property_writers 、バージョン 3 ではそのようなことはありません。

  ko.bindingHandlers.htmlValue = {
    init: function(element, valueAccessor, allBindingsAccessor, context) {
      var handler;
      handler = function() {
        var value, writable;
        writable = valueAccessor();
        console.log(allBindingsAccessor());
        value = element.innerHTML;
        // NOTE In previous versions this could be used:
        //writable(value);
        //writable = value <-- this also does not update model, as writable is simple string
        // Or this:
        //allBindingsAccessor()._ko_property_writers

        return allBindingsAccessor().htmlValue = value;
      };
      ko.utils.registerEventHandler(element, "keyup", handler);
      ko.utils.registerEventHandler(document, "click", handler);
    },
    update: function(element, valueAccessor) {
      var value;
      value = valueAccessor();
      if (element.innerHTML !== value) {
        element.innerHTML = value;
      }
    }
  };

var data = {
    name: 'blah'
};

ko.track(data);
ko.applyBindings({data: data});

私のHTML:

<div contenteditable="true" data-bind="htmlValue: data.name"></div>
<input data-bind="value: data.name, valueUpdate: 'afterkeydown'"></input>
<input data-bind="value: data.name, valueUpdate: 'afterkeydown'"></input>

Js はこの例をいじります: http://jsfiddle.net/t5rWd/2/

予想される動作: div コンテンツを変更した後に入力を更新する必要があります (コンテンツ編集可能です) 。

現在の動作:一方向バインディングのように機能し、div は更新されますが、入力は更新できません。

4

1 に答える 1

0

OPのコメントは実際にはおそらく答えになることに注意してください。これは のバグknockout-es5-pluginです。

OPのアカウントが現在非アクティブであるため、その情報を保持するためにこのコミュニティwikiの回答を投稿しています。コメント全文:

そうです、これはプラグインの問題です。これに対処するためのプル リクエストは次のとおりです。

于 2015-05-10T10:17:40.690 に答える