我正在制作一些小部件。它不使用任何Web服务作为数据源。我使用来自普通网页的jQuery解析一些数据,并希望将此数据显示为破折号列表。我按照Dashcode中的listDataSource示例代码。
var listDataSource = {
_rowData: ['Item 1', 'Item 2', 'Item 3'],
numberOfRows: function() {
alert("Row data now is: "+this._rowData);
alert("number of rows: "+this._rowData.length);
return this._rowData.length;
},
prepareRow: function(rowElement, rowIndex, templateElements) {
if (templateElements.rowLabel) {
templateElements.rowLabel.innerText = this._rowData[rowIndex];
}
rowElement.ondblclick = function(event) {
// Do something interesting
alert("Row "+rowIndex);
};
}
};
在属性inspenctor中,我选择了动态数据类型,并将此listDataSource选为数据源。 然后,我以这种方式向listDataSource的_rowData添加一个项目:
listDataSource._rowData.push("New Item 4");
以这种方式重新加载我的列表:
var mylist = document.getElementById("list").object;
mylist.reloadData();
我知道,函数numberOfRows和prepareRow在我添加新项目后被调用(通过警报消息)。警报打印_rowData,并按预期添加新项目。 但我的小部件中的列表不刷新!为什么?我真的无法弄明白。是否有一些函数reloadUI()或什么? 如果你现在解决我的问题,请把我带到路上。谢谢!
答案 0 :(得分:0)
我自己发现了一个丑陋的黑客。 如果调用reloadData()两次 - UI中的列表按预期刷新。
另一个解决方案是使用global var并在reloadData()
之前设置它var myData['Item 1', 'Item 2', 'Item 3'];
var listDataSource = {
_rowData: myData,
numberOfRows: function() {
alert("Row data now is: "+this._rowData);
alert("number of rows: "+this._rowData.length);
return this._rowData.length;
},
prepareRow: function(rowElement, rowIndex, templateElements) {
if (templateElements.rowLabel) {
templateElements.rowLabel.innerText = this._rowData[rowIndex];
}
rowElement.ondblclick = function(event) {
// Do something interesting
alert("Row "+rowIndex);
};
}
};
然后
myData.push("Item 4");
并将新数据数组设置为list,然后重新加载:
var mylist = document.getElementById("list").object;
mylist.setDataArray(myData);
mylist.reloadData();
但此解决方案禁用了rowElement上的回调函数
alert("Row "+rowIndex);
设置新的dataArray后不起作用,所以我选择double reloadData hack:
var mylist = document.getElementById("list").object;
mylist.reloadData();
mylist.reloadData();