Knockoutjs:动态内容和applyBindings

时间:2011-12-31 13:32:30

标签: javascript jquery knockout.js

我“动态”填充我的页面,如下所示:

<script type="text/html" id="ContainerTemplate">
  <span data-bind="template: {
                     name: contentTemplate,
                     data: contentData }"></span>
</script>

<script type="text/html" id="fooTemplate">
  <span data-bind="text: barAttribute"></span>
</script>

<button data-bind="click: complete">complete</button>

Hello
<span data-bind="template: { name: 'ContainerTemplate', foreach: myContents }"></span>
!

视图模型:

var viewModel = {
    myContents: ko.observableArray([]),
    complete: function() {
        viewModel.myContents.push({
            contentTemplate:'fooTemplate',
            contentData:{barAttribute:'world'}});
    }
};

ko.applyBindings(viewModel);

一个特殊之处是模板名称是动态的。它似乎像这样工作(你可以在http://jsfiddle.net/hPQNx/上尝试),但我想知道我是否正确地做事。某些模板功能(如root或parent)似乎无法正常工作。

我应该在某个时候手动重新调用applyBindings吗?我已经看到这必须在相关的DOM节点上完成,但是如何在我的设置中访问这些节点?

1 个答案:

答案 0 :(得分:3)

我在您的视图模型中添加了一个属性,并展示了如何添加root属性并使用$root引用它,$parent可以在这个小提琴中使用。

var viewModel = {
    a: ko.observable('foo'),
    myContents: ko.observableArray([]),
    complete: function() {
        viewModel.myContents.push({
            contentTemplate: 'fooTemplate',
            b: 'goo',
            contentData: {
                barAttribute: 'world'
            }
        });
    }
};

ko.applyBindings(viewModel);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/2.0.0/knockout-min.js"></script>
<script type="text/html" id="ContainerTemplate">
  <span data-bind="template: {
                     name: contentTemplate,
                     data: contentData }"></span>
</script>
      
<script type="text/html" id="fooTemplate">
  <span data-bind="text: barAttribute"></span>
  <div data-bind="text: $root.a"></div>
  <div data-bind="text: $parent.b"></div>
</script>

<button data-bind="click: complete">complete</button>

Hello
<span data-bind="template: { name: 'ContainerTemplate', foreach: myContents }"></span>
!