javascript - Ember.js 异步模型

标签 javascript asynchronous ember.js promise

我有一个文本文件,用于使用 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/

相关文章:

javascript - 如何限制 ember.js 中 findAll 的结果?

ember.js - Ember 身份验证最佳实践?

javascript - 关于将 javascript 事件与 innerHTML DOM 元素绑定(bind)的问题

javascript - 在 JavaScript/HTML 中按下按钮后如何将文本从一个文本框复制到另一个文本框

android - 异步任务仅在 Debug模式下检索数据(android)

cocoa - 如何阻止直到 Cocoa 中发布特定通知?

javascript - ember.js 是否仍然支持 ObjectController?如果不是,用什么代替它?

javascript - 本地存储 : Storing data individually VS one big String?

javascript - 如何根据条件合并对象的数组属性?

javascript - 如何使 tx.executeSql() 函数与 async/await 同步?