使用Knockoutjs为每个项目选择一个自定义模板

Bri*_*unt 2 knockout-2.0 knockout.js

给定映射knockout.js并使用自定义模板的数组,如何使用不同的模板渲染数组中的每个项目?

这是一个关于所需功能的jsFiddle示例的链接- 有点像人们希望的那样.

简单来说,给定一个这样的数组:

people: ko.observableArray([
    { name: 'Rod', age: 123, template: 'personItem' },
    { name: 'IBM', incorporated: 1911, template: 'corporateItem' },
])
Run Code Online (Sandbox Code Playgroud)

如何设置一个foreach:绑定,为一些项目使用一个模板,为其他项目设置不同的模板.

(注意:我知道使用下划线模板会在某种程度上混淆问题,并为任何不必要的混淆道歉.)

我曾考虑过使用一个带有一组if绑定的模板 - 每个模板类型一个,如下所示:

<div data-bind='foreach: people'>
   <div data-bind='if: people.template() == "personItem"'>
   </div>
   <div data-bind='if: people.template() == "corporateItem"'>
   </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这似乎相当不优雅,我怀疑(希望)有一个更优雅,相当直接的选择.

任何想法将非常感谢并感谢阅读.

RP *_*yer 15

您可以实际传递一个函数来确定模板,而不是将字符串传递给绑定的name参数template.您必须将此与foreach在您的案例中使用选项结合使用,而不是通过您的项目执行"每个".

所以,你的视图模型看起来像:

var viewModel = {
    people: ko.observableArray([
        { name: 'Rod', age: 123, template: 'personItem' },
        { name: 'IBM', incorporated: 1911, template: 'corporateItem' },
    ]),
    getTemplate: function(item) {
        return item.template;   
    }
};
Run Code Online (Sandbox Code Playgroud)

你的标记就像:

<ul data-bind="template: { name: getTemplate, foreach: people }"></ul>

<script type="text/html" id="personItem">
        <li>
            <b data-bind="text: name"></b> is <%= age %> years old
        </li>
</script>

<script type="text/html" id="corporateItem">
        <li>
            <b data-bind="text: name"></b> is <%= incorporated %> years old
        </li>
</script>
Run Code Online (Sandbox Code Playgroud)

这是一个例子:http://jsfiddle.net/rniemeyer/xF2xe/

以下是一些额外的参考资料: