我有一个文本文件,用于使用 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}}
关于javascript - Ember.js 异步模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33154503/