敲除数据绑定到自生成 DOM

knockout data-bind to self-generated DOM

我在初始化 viewmodel 后尝试将数据绑定应用到自生成的 DOM 元素。但这似乎行不通,所以我有一个问题:是否有可能让这个数据绑定工作 (也许有某种更新功能) 或没有。

例如:

html:

<div id="content">
    <button onclick="create">create DOM ele</button>
</div>

javascript:

function MyViewModel() {
    var self = this;
    self.title = ko.observable('TITLE');
    }

ko.applyBindings(new MyViewModel());

function create() {
    div = document.createElement('div');
    div.setAttribute('data-bind', 'title()');

    document.getElementById("content").appendChild(div);
}

所以 div 将在按下该按钮后创建,如果我用浏览器查看对象,数据绑定实际上是 DOMelement 的一个属性Inspektor,但 viewmodel.title() 的内容永远不会显示。

数据绑定属性在 applyBindings 为 运行 时处理,这在您触发 create() 之前很久就已完成。您可以 运行 在 create() 期间在创建期间添加到页面的元素的子树上应用绑定。

function create() {
  div = document.createElement('div');
  div.setAttribute('data-bind', 'title()');

  ko.applyBindings(
    new MyViewModel(),
    div;
  )
}

你的做法是错误的。您不应该创建 DOM 元素,这就是 Knockout 的用途。

你的工作是操纵视图模型。淘汰赛的工作是操纵 DOM.

function MyViewModel() {
  var self = this;

  self.title = ko.observable('TITLE');
  self.children = ko.observableArray();

  self.create = function () {
    self.children.push({
      name: "Child " + self.children().length
    });
  }
}

ko.applyBindings(new MyViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div id="content">
    <button data-bind="click: create">create item</button>
    <div data-bind="foreach: children">
      <div data-bind="text: name"></div>
    </div>
</div>

<hr>
<pre data-bind="text: ko.toJSON($root, null, 2)" style="font-size: small;"></pre>