当源为null / undefined时,模板绑定不起作用

时间:2014-05-18 09:15:26

标签: knockout.js

任何人都可以在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>

2 个答案:

答案 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

withif)绑定以实现相同的结果:

<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>