我试图弄清楚为什么这个嵌套模板不显示任何东西.我有2个类Foo/Bar,ViewModel有一个可观察的Foo数组,而Foo有一个Bar的集合
目前我所看到的只是Foo项目
即
代替
someitem
项目清单
<ul data-bind="template: {name: 'TopTemplate' , foreach: foos}"></ul>
<script type="text/html" id="TopTemplate">
<li data-bind='text: Name'>
<ul data-bind=" template: {name: 'NestedTemplate' , foreach: bars} " style="list-style-type:circle;margin-left:15px">
</ul>
</li>
</script>
<script type="text/html" id="NestedTemplate">
<li data-bind='text: Name'>
</li>
</script>
var Foo = function () {
var self = this;
self.Name = ko.observable('someitem');
self.bars = ko.observableArray([new Bar()]);
self.HasChildren = ko.observable(false);
self.addBar = function () {
self.bars.push(new Bar());
};
self.removeBar = function (param) {
self.bars.remove(param);
};
self.bars.push(new Bar());
}
var Bar = function () {
var self = this;
self.Name = ko.observable('subitem');
}
var ViewModel = function () {
var self = this;
self.foos = ko.observableArray([new Foo()]);
self.addFoo = function () {
self.foos.push(new Foo());
};
self.removeFoo = function (param) {
self.foos.remove(param);
};
}
$.ajax({
url: '@Url.Action("AddFoos")',
type: 'GET',
async: false,
contentType: 'application/json',
success: function (result) {
ko.applyBindings(new ViewModel(result));
}
});
Run Code Online (Sandbox Code Playgroud)
提前致谢!
淘汰赛有一些问题结合text中li的某种原因.我之前遇到过这个问题.它最终会覆盖节点上应该出现的所有其他内容,在您的情况下是内部的ul.你可以使用这样的span或任何其他文本元素来解决这个问题:
<li><span data-bind='text: Name'></span>
Run Code Online (Sandbox Code Playgroud)
这是你工作小提琴的代码.
一个小注释,你的ajax调用将失败,因为你的ViewModel没有参数来获取结果.
此外,调用这样applyBindings的函数是不好的,因为如果它被调用两次你将导致错误.如果您调用一次,稍后对viewmodel所做的更新将自动发送到UI.这就是Knockout的东西=)
更新:
经过进一步考虑,这可能不是特定于li节点.可能是text绑定通过覆盖它绑定的任何节点的内容来工作,因此除了文本之外的任何内容也将被覆盖.这可能是故意的.