ember.js - Ember : How to cleanly replace model data and have progress indicators

标签 ember.js ember-data

我有一个显示项目列表的特定路由,它根据用户是谁从我的 RESTAdapter 获取初始数据。

我现在正在实现一个搜索功能,它将发出一个新的 API 调用,以便用户可以获得除默认记录之外的记录,并且响应应该替换该路由的模型。我有所有这些工作,但我不确定如何做加载或进度指示器(因为来自数据库的响应可能需要 5-10 秒,具体取决于数据量)。我知道加载子状态,但在这种情况下,我不会在路由之间转换。我只想至少有一个微调器,以便用户知道它正在处理某些事情。

之前做过这件事的人是否愿意分享他们如何处理 a) 用新数据替换模型,以及 b) 使用微调器或其他东西让用户了解情况?

当用户单击“搜索”按钮时调用的表单操作

searchProjects: function() {
  var query = this.get('queryString');
  if (query) {
    var _this = this;
    var projects = this.store.find('project', {q: query});
    projects.then(function(){
      _this.set('model', projects);
    });
  }
}

最佳答案

a) replacing the model with new data



你不需要做任何事情。如果您从后端正确加载记录,Ember 将自动在前端更新它们。

b) keeping the user informed with a spinner or something



加载子状态是一个急切的转换。 Ember 还通过 loading 支持延迟转换。事件。

您可以使用该事件来显示微调器。

这是来自 docs 的示例:
App.ApplicationRoute = Ember.Route.extend({
  actions: {
    loading: function(transition, route) {
      showSpinner();

      this.router.one('didTransition', function() {
        hideSpinner();
      });

      return true; // Bubble the loading event
    }
  }
});

UPD1

I need to do at least what I'm doing right? Setting the model to the response?



您需要通过 query params 在 URL 中反射(reflect)搜索。 .这将使路由器自动为您更新模型。

what I would put in showSpinner to affect stuff on the page (like, can I use jQuery to show or hide a spinner element?), or show the actual loading substate.



我会在该页面的 Controller 上设置一个属性:
App.IndexRoute = Ember.Route.extend({
  queryParams: {
    search: {
      refreshModel: true
    }
  },
  model () {
    return new Ember.RSVP.Promise( resolve => setTimeout(resolve, 1000));
  },

  actions: {
    loading (transition, route) {

      this.controller.set('showSpinner', true);

      this.router.one('didTransition', () => {
        this.controller.set('showSpinner', false);
      });

      return true;
    }
  }
});

App.IndexController = Ember.Controller.extend({
  queryParams: ['search'],
  search:      null,
  showSpinner: false,
});

演示:http://emberjs.jsbin.com/poxika/2/edit?html,js,output

或者您可以简单地将微调器放入加载模板中,这将隐藏过时的数据:

http://emberjs.jsbin.com/poxika/3/edit?html,js,output

或者您可以将您的微调器放入加载模板中:

关于ember.js - Ember : How to cleanly replace model data and have progress indicators,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31878352/

相关文章:

javascript - EmberJS 可选参数

unit-testing - 测试 ember 应用程序时去抖函数调用的错误

javascript - Emberjs 组件 Action

ruby-on-rails - 将现有的 Rails 路由/应用程序迁移到 emberjs

javascript - 重新加载 Ember 数据模型

Ember.js——如何从路由访问 Ember session 中的数据

javascript - 将 Ember 数据与非标准 REST API 结合使用

ember.js - Ember - 使用 hasMany 属性时如何在多选中预选项目?

javascript - 使用 ember 更新属性后如何滚动到向下

javascript - Ember.js 在运行类方法时抛出 "has no method"错误