任何人都可以在this example jsfiddle向我解释我的视图模型或模板有什么问题吗?
它没有按预期工作。基本上,视图模型包含一个对象,该对象是null
。在视图中,有一个绑定到此对象的模板。由于此对象为null,因此不应呈现模板。但是,它确实尝试渲染模板并在我的示例中失败。如果job对象为null,那么我不想渲染模板。
根据this article by Ryan,如果一个视图模型包含一个空对象,并且该对象有一个“template
绑定”,它将不会呈现该模板。
这是我的观点模型:
var job = function(title) {
this.jobTitle = ko.observable(title);
}
var ViewModel = function(first, last) {
this.firstName = ko.observable(first);
this.lastName = ko.observable(last);
//this.job = ko.observable(new job("software developer"));
this.job = ko.observable(null);
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
};
ko.applyBindings(new ViewModel("FirstName", "LastName"));
这就是观点:
<div class='liveExample'>
<p>First name: <input data-bind='value: firstName' /></p>
<p>Last name: <input data-bind='value: lastName' /></p>
<p data-bind="template: { name: 'editorTmpl', data: job }"></p>
<h2>Hello, <span data-bind='text: fullName'> </span>!</h2>
</div>
<script id="editorTmpl" type="text/html">
Job: <input data-bind='value: jobTitle' />
</script>
答案 0 :(得分:7)
linked artifice写于差不多3年前。当Knockout的最新版本大约为1.2.1时。
在Knockout 1.2.1中,您的代码运行正常:Demo using KO 1.2.1
然而从那时起,Knockout已经发生了很大变化,因此它不再支持这种行为了。
现在你需要使用if
option of the template绑定
<p data-bind="template: { name: 'editorTmpl', if: job, data: job}"></p>
演示JSFiddle。
或with
(if
)绑定以实现相同的结果:
<div class='liveExample'>
<p>First name: <input data-bind='value: firstName' /></p>
<p>Last name: <input data-bind='value: lastName' /></p>
<!-- ko with: job -->
<p data-bind="template: { name: 'editorTmpl'}"></p>
<!-- /ko -->
<h2>Hello, <span data-bind='text: fullName'> </span>!</h2>
</div>
演示JSFiddle。
答案 1 :(得分:3)
您可以使用div来包围模板绑定,该div使用与作业可观察的“if”数据绑定:
<div data-bind="if: job">
<p data-bind="template: { name: 'editorTmpl', data: job }"></p>
</div>
编辑器模板在作业为空时隐藏,在非空时隐藏。
编辑:
更好的解决方案是将'if'选项传递给模板绑定:
<p data-bind="template: { if: job, name: 'editorTmpl', data: job }"></p>