Knockout.js 源为空/未定义时模板绑定不工作

Knockout.js 源为空/未定义时模板绑定不工作,knockout.js,Knockout.js,有人能解释一下我的视图模型或模板在中的错误吗 它没有按预期工作。基本上,视图模型包含一个对象,该对象为null。在视图中,有一个模板绑定到此对象。由于此对象为null,因此不应呈现模板。但是,它确实尝试呈现模板,在我的示例中失败了。如果作业对象为null,则我不希望呈现模板 根据,如果viewmodel包含空对象,并且该对象具有“templatebinding”,则它不会呈现该模板 以下是我的视图模型: var job = function(title) { this.jobTitle

有人能解释一下我的视图模型或模板在中的错误吗

它没有按预期工作。基本上,视图模型包含一个对象,该对象为
null
。在视图中,有一个模板绑定到此对象。由于此对象为null,因此不应呈现模板。但是,它确实尝试呈现模板,在我的示例中失败了。如果作业对象为null,则我不希望呈现模板

根据,如果viewmodel包含空对象,并且该对象具有“
template
binding”,则它不会呈现该模板

以下是我的视图模型:

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围绕模板绑定,该div使用“if”数据绑定到可观察的作业:

<div data-bind="if: job">
    <p data-bind="template: { name: 'editorTmpl', data: job }"></p>
</div>

当作业为null时,编辑器模板隐藏,当作业不为null时,编辑器模板可见

编辑:

更好的解决方案是将“if”选项传递给模板绑定:

<p data-bind="template: { if: job, name: 'editorTmpl', data: job }"></p>

这本书差不多是3年前写的。最新版本的淘汰赛大约是1.2.1

在淘汰赛1.2.1中,您的代码运行良好:

然而,从那时起,击倒已经改变了很多,所以它不再支持这种行为

现在你需要使用装订


演示。

虽然你说的是“尝试”,但这是对Ryan的示例和ko 3.0的一种玩弄。它工作得很好:@GôTô不,它工作得不好。。。
li
会在其中呈现一个
结果,尽管
selectedItem
为空…是的,但至少不会引发错误。你知道为什么一个函数抛出错误而不是另一个吗?这不是因为绑定中使用的属性名:
name
(我猜在这个示例中,一个函数被用作bindingcontext,每个函数都有一个
name
属性)。如果您使用不同的属性名称,它将抛出一个错误:的确,感谢您花时间指出这一点()
<p data-bind="template: { name: 'editorTmpl', if: job, data: job}"></p>
<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>