[英]Ember.js asynchronous model
我有一个文本文件,正在使用ember-models-table( https://github.com/onechiporenko/ember-models-table )组件创建表。 我有一个将文件转换成json对象的函数。 我在获取异步加载时遇到了一些困难。 我希望带有表头的页面立即加载,并且数据一旦加载就显示。 在加载数据之前,我目前没有显示任何内容。 我究竟做错了什么? 谢谢您的帮助。
import Ember from 'ember';
function getData(columns, url, deliminator) {
return Ember.$.get(url).then(function(file) {
var data = [];
var headers = [];
var lines = file.split("\n");
for(var i = 0; i < columns.length; i++){
headers[i] = columns[i].propertyName;
}
for(var j = 0; j < lines.length; j++){
var obj = {};
var currentline = lines[j].split(deliminator);
for(var k = 0; k < headers.length; k++){
obj[headers[k]] = currentline[k];
}
data.push(obj);
}
return data;
});
}
export default Ember.Route.extend({
model() {
var columns = [
{
"propertyName": "date",
"title": "Date/Time"
},
{
"propertyName": "application",
"title": "Application"
},
{
"propertyName": "priority",
"title": "Priority"
},
{
"propertyName": "message",
"title": "Message"
}
];
var url = 'http://localhost:4200/Errors.log';
var deliminator = '|';
return getData(columns, url, deliminator).then(function(data) {
return {columns, data};
});
}
});
假设ember表模型将正确更新,诀窍是不返回promise,而是立即返回对象并在事实发生后异步更新对象。
function populateData(columns, url, deliminator, data) {
Ember.$.get(url).then(function(file) {
var headers = [];
var lines = file.split("\n");
for(var i = 0; i < columns.length; i++){
headers[i] = columns[i].propertyName;
}
for(var j = 0; j < lines.length; j++){
var obj = {};
var currentline = lines[j].split(deliminator);
for(var k = 0; k < headers.length; k++){
obj[headers[k]] = currentline[k];
}
// this is important here, you want to use pushObject instead of push
data.pushObject(obj);
}
});
}
export default Ember.Route.extend({
model() {
var columns = [
{
"propertyName": "date",
"title": "Date/Time"
},
{
"propertyName": "application",
"title": "Application"
},
{
"propertyName": "priority",
"title": "Priority"
},
{
"propertyName": "message",
"title": "Message"
}
];
var url = 'http://localhost:4200/Errors.log',
deliminator = '|',
data = [];
populateData(columns, url, deliminator, data);
// ES6 Enhanced Object Properties, Property Shorthand
return {columns, data};
}
});
function getData(columns, url, deliminator) {
return Ember.$.get(url).then(function(file) {
var headers = [];
var data = [];
var lines = file.split("\n");
for(var i = 0; i < columns.length; i++){
headers[i] = columns[i].propertyName;
}
for(var j = 0; j < lines.length; j++){
var obj = {};
var currentline = lines[j].split(deliminator);
for(var k = 0; k < headers.length; k++){
obj[headers[k]] = currentline[k];
}
// this is important here, you want to use pushObject instead of push
data.push(obj);
}
return data;
});
}
export default Ember.Route.extend({
model() {
var columns = [
{
"propertyName": "date",
"title": "Date/Time"
},
{
"propertyName": "application",
"title": "Application"
},
{
"propertyName": "priority",
"title": "Priority"
},
{
"propertyName": "message",
"title": "Message"
}
];
var url = 'http://localhost:4200/Errors.log',
deliminator = '|',
dataObj = { data: [] };
getData(columns, url, deliminator).then(data => Ember.set(dataObj, 'data', data));
// ES6 Enhanced Object Properties, Property Shorthand
return {columns, dataObj};
}
});
然后,您可以在模板内部引用{{model.dataObj.data}}
而不是{{model.data}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.