2011-12-31 71 views
3

我 “动态” 填充我的网页是这样的:Knockoutjs:动态内容和applyBindings

<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/),但是我想知道我是否正确地做事。某些模板功能(如根或父级)似乎无法正常工作。

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

回答

3

我向您的视图模型中添加了一个属性,并展示了如何添加根属性并将其与$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> 
 
!

+0

的确。我很抱歉没有在小提琴中进行过这样的测试。我的假设是,这是因为动态模板,但这可能是因为我有一个老版本的Knockoutjs(1.2.1)?有没有版本的文档,或者我可以检查的功能更改日志? – Gnurfos 2011-12-31 16:32:33

+2

1.2.1不支持$ root,$ parent,$ parents(或者jQuery模板之外的$ data)。这些上下文变量在2.0中添加。 – 2011-12-31 17:57:18

+2

@Gnurfos - 没错。直到KO 2.0.0才添加这些功能。 KO 2中几乎没有什么重大变化。唯一让我难以忍受的是,在以前的版本中,事件处理程序接收到DOM事件对象作为第一个参数。在KO v2中,事件处理程序接收模型作为第一个参数,并将DOM事件对象作为第二个参数。您将需要更改任何使用DOM事件对象的KO代码来将其作为第二个参数进行解释。 // KO 1.2 myViewModel.myEventHandler =功能(EVT) // KO V2 myViewModel.myEventHandler =功能(数据,EVT) – 2011-12-31 20:23:08