所以我试图通过模板显示来自JSON请求的一些数据。数据有一些与此类似的嵌套对象(不同数量):
data: "Some data",
nested: [
{
nested_data: "foo",
bar: "foobar"
}, ...
],
...
我设法解析JSON并将其存储在WinJS.Binding.List
对象中,并将结果绑定到模板。我遇到的问题实际上是在我的模板中显示嵌套的JSON数据。模板看起来像这样:
<div class="appTemplate">
<div class="innerTemplate">
<h1 data-win-bind="innerText: data">
<h2 data-win-bind="innerText: nested">
</div>
</div>
当我运行程序时,“嵌套”#39;模板的一部分只是一堆[object Object]
,而不是我想要显示的数据。
我是否有某种方法可以创建模板以便它可以处理嵌套数据?定义模板函数会更容易吗?不知道该怎么做......
答案 0 :(得分:4)
没有内置的方法可以做到这一点 - 迭代数据的唯一内置控件是列表视图。但是,您无法嵌套列表视图。
根据您的预期结果,有两种方法可以解决此问题:
1)对嵌套数据进行字符串化:您可以通过编写将您的数据数组转换为单个字符串值的WinJS.Binding.converter
来实现此目的。实施例
代码:
WinJS.Namespace.define("Examples.Converters", {
nestedDataConverter: WinJS.Binding.converter(function(input) {
// Assume input is array
var result = "";
input.forEach(function(data) {
result += data.nested_data + ", " + bar + ";";
});
result result;
}),
});
模板:
我推荐的解决方案是构建您的自己的控件,该控件将获取您的数组(或WinJS.Binding.List
)并创建所需的元素/布局。我在我正在进行的项目中完成了这项工作,这非常简单。
示例模板:
<div class="appTemplate" data-win-control="WinJS.Binding.Template">
<div class="innerTemplate">
<h1 data-win-bind="innerText: data">
<h2 data-win-bind="innerText: nested Examples.Converters.nestedDataConverter">
</div>
</div>
现在,h2将拥有该数据的单字符串版本。
2)创建一个控件以丰富地显示数据:为此,您需要创建一个新的WinJS控件并在模板中使用它。
控制示例:
WinJS.Namespace.define("Examples.Controls", {
Stamper: WinJS.Class.define(function(element, options) {
WinJS.UI.setOptions(this, options);
this.domElement = element;
}, {
domElement: nullm
_data: null,
data: {
set: function(val) {
this._data = val;
updateLayout();
}
},
updateLayout: function() {
this.domElement.innerHTML = "";
if(!this._data) {
return;
}
this._data.forEach(function(item) {
var el = document.createElement("div");
el.textContent = "Data: " + item.nested_data + ", " + item.bar;
this.domElement.appendChild(el);
}.bind(this));
}
}),
});
模板:
<div class="appTemplate" data-win-control="WinJS.Binding.Template">
<div class="innerTemplate">
<h1 data-win-bind="innerText: data"></h1>
<div data-win-control="Examples.Controls.Stamper"
data-win-bind="winControl.data: nested"></div>
</div>
</div>
此控件可以扩展为呈现嵌套模板和其他项目。这都是你想要获得多么复杂的问题。
答案 1 :(得分:0)
尝试data-win-bind="innerText: nested.nested_data"
答案 2 :(得分:0)
使用模板功能会更容易。
内置的可绑定模板非常适合无逻辑的模板,但是当您需要模板根据数据值进行决策时,以及在您的情况下,更深层的属性,这些模板都会失败。