好的,在我展示我的代码和我的方法之前,让我解释一下手头的问题是什么,也许有人有更好的解决方案。问题是我有一个按特定标准分组的数组列表。我需要根据标准呈现一个列表/部分,每个部分都包含一个对象列表,这些对象也应该呈现为 HTML。
我是 KnockoutJS 的新手——我昨天开始使用它。但是考虑到手头的问题,我在文档中搜索了可观察的字典或类似的东西。幸运的是,我找到了ko.observableDictionary 插件。所以我认为这应该可以解决问题并编写了以下代码(只是一些概念证明):
<div id="tiles-holder" data-bind="template: { name: 'tile-list', foreach: dictionary }">
</div>
<script type="text/html" id="tile-list">
<div class="md-auto-max-width">
<div class="md-list-tiles md-auto-arrange-tiles" data-bind="template: { name: 'tile-default', foreach: items }"></div>
</div>
</script>
<script type="text/html" id="tile-default">
<div class="metro-tile-square md-list-item md-list-tile-large">
<div class="md-list-item-image" data-bind="css: { defaultimage: $data.title() != 'architect' }"></div>
<div>
<span data-bind="text: name"></span> - <span data-bind="text: $data.department"></span>
</div>
</div>
</script>
<script type="text/javascript" src="@Url.Content("~/Scripts/metro/ko.observableDictionary.js")"></script>
<script type="text/javascript">
$(function () {
var viewModel = function TileViewModel() {
var self = this;
self.dictionary = new ko.observableDictionary();
for (var i = 0; i < 15; i++) {
self.dictionary.push("Developers", new employee('developer' + i, 'developer', 'projectDevelopment'));
self.dictionary.push("Analysts", new employee('analyst' + i, 'analyst', 'business intelligence'));
}
self.dictionary.push("Architects",new employee('Some Architect', 'architect', 'Architecture and development'));
function employee(name, title, department) {
this.name = ko.observable(name);
this.title = ko.observable(title);
this.department = ko.observable(department);
}
};
ko.applyBindings(new viewModel(), $('#tiles-holder').get(0));
});
</script>
但我不断收到以下错误:
错误:无法解析绑定。消息:TypeError:$data.title 不是函数;绑定值:css: { defaultimage: $data.title() != 'architect' }
我认为问题在于$data
没有引用模板的数据上下文。但是我该如何解决呢?