敲除数据绑定动态生成的元素

Kin*_*ien 46 javascript jquery knockout.js

怎样才能使knockout数据绑定对动态生成的元素起作用?例如,我在div中插入一个简单的html选择菜单,并希望使用knockout选项绑定填充选项.这就是我的代码:

$('#menu').html('<select name="list" data-bind="options: listItems"></select>');
Run Code Online (Sandbox Code Playgroud)

但这种方法不起作用.有任何想法吗?

PlT*_*lor 31

如果在绑定viewmodel后动态添加此元素,则它将不在viewmodel中,并且不会更新.你可以做两件事之一.

  1. 将元素添加到DOM并通过ko.applyBindings();再次调用重新绑定它
  2. 或者从头开始将列表添加到DOM,并将viewmodel中的选项集合留空.Knockout将不会呈现它,直到您稍后向选项添加元素.

  • 如果我再次调用applyBindings它会抛出一个错误:错误:您不能多次将绑定应用于同一个元素. (14认同)
  • 这必须是更新框架的新功能.第二种选择仍然可行,老实说,这是一个更好的选择. (2认同)

Ste*_*cus 12

淘汰赛3.3

ko.bindingHandlers.htmlWithBinding = {
          'init': function() {
            return { 'controlsDescendantBindings': true };
          },
          'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
              element.innerHTML = valueAccessor();
              ko.applyBindingsToDescendants(bindingContext, element);
          }
    };
Run Code Online (Sandbox Code Playgroud)

上面的代码片段允许您使用"htmlWithBinding"属性动态注入html元素.然后还评估添加的子元素......即它们的数据绑定属性.


小智 10

重写html绑定代码或创建一个新的.因为html绑定阻止了动态html中的"注入绑定":

ko.bindingHandlers['html'] = {
  //'init': function() {
  //  return { 'controlsDescendantBindings': true }; // this line prevents parse "injected binding"
  //},
  'update': function (element, valueAccessor) {
    // setHtml will unwrap the value if needed
    ko.utils.setHtml(element, valueAccessor());
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 在查看了该线程的所有答案和评论之后,IMO实际上是解决"动态生成元素的敲除数据绑定"问题的最佳解决方案.好解! (3认同)