Javascript 淘汰模板和视图模型的绑定

Javascript 淘汰模板和视图模型的绑定,javascript,knockout.js,Javascript,Knockout.js,我在尝试使用淘汰模板时遇到了一些问题 我想使用一个选择列表,允许用户选择一个值,该值依次显示模板 模板需要有自己的viewmodel属性,每个属性之间都不同 我创造了一个展示整个事情的模型 我有两个非常基本的模板,但是当我尝试运行页面时,我得到一个错误。代码不是生产代码,而是简单的一次性代码,因此命名约定并不完美: 错误:无法处理绑定foreach:function{return contacts}消息:无法处理绑定模板:function{return{name:contactTypeId}消息

我在尝试使用淘汰模板时遇到了一些问题

我想使用一个选择列表,允许用户选择一个值,该值依次显示模板

模板需要有自己的viewmodel属性,每个属性之间都不同

我创造了一个展示整个事情的模型

我有两个非常基本的模板,但是当我尝试运行页面时,我得到一个错误。代码不是生产代码,而是简单的一次性代码,因此命名约定并不完美:

错误:无法处理绑定foreach:function{return contacts}消息:无法处理绑定模板:function{return{name:contactTypeId}消息:未知模板类型:1

模板确实存在

<script type="text/html" id="1">
    <span> Family Template </span>
    <input placeholder="From Mum or Dads side"/>
</script>
<script type="text/html" id="2">
    <span> Friend Template </span>
    <input placeholder="Where did you meet your friend"/>
</script>
可能是因为没有睡觉,但我不能让它工作。控制台告诉我有些东西没有定义


就算我的名字不好。我还更新了

问题1的问题似乎是您传入了一个需要字符串的数字。不管出于什么原因,它不是自动被强迫的。这就解决了问题

 template: { name: contactTypeId().toString() }
更好的是,创建一个计算的前缀并添加一个合理的前缀

 templateName = ko.computed(function() { return "contact-type-" + contactTypeId() })
至于通过不同的模式。模板绑定支持数据属性。您的数据属性也可以基于contactTypeId进行计算

因此,您可以使用 模板:{name:contactTypeTemplateName,数据:contactTypeTemplateModel}


我还应该提到,除非您在许多地方独立地重用这些模板,否则我不推荐使用这些模板。我只想使用if绑定。

这实际上是一个非常有趣的边缘案例,解释了为什么找不到模板。我想记录这一点或修复它。感谢George在第一个问题上的帮助。我发现了一个bug:关于绑定支持,如果我通过Friend模板将数据绑定添加到模板中。我如何告诉我的模型“whereDidYouMeet”属性编辑了答案,给出了一个更好的例子。基本上,不要将所有内容都视为一个模型,每个独立的html都可以有自己的模型,由父模型引用。这样做的常见错误是在同一页面上多次调用applyBindings
 template: { name: contactTypeId().toString() }
 templateName = ko.computed(function() { return "contact-type-" + contactTypeId() })
 self.contactTypeTemplateModel = ko.computed(function() { 
  return self.contactTypeId() === 2 ? someModelWithWhereDidYouMeet 
                                    : someOtherModel })