在两个控制器之间共享通用功能,Ember.js 2.0方式

时间:2015-03-26 17:13:05

标签: ember.js ember-cli

现在,我有一个资源providers,我有一个index,我有一个route 'show',还有几条路线,其他几条路线用于列出不同的用户。这是完整的 router.coffee 文件

Router.map ->
  @resource 'admin', ->
    @resource 'admin.providers', { path: '/providers' }, ->
      @route 'show'
      @route 'unapproved'
      @route 'approved'
      @route 'pending'

问题是index只是未经批准,已批准和待定页面的组合,每个页面都使用具有不同type参数的单个模型获取

我最初的设置方向是创建组件(尝试使用Ember 2.0方式并避免所有视图)所以我创建了unapproved-proapproved-pro等等,使用了ember-table来在桌子上显示东西。我以为我会让这些组件自给自足,以便他们获取数据,获取下一页以及其他操作(如删除或更新)

现在从阅读(http://discuss.emberjs.com/t/how-to-make-ember-component-fetch-data-from-server-put-ajax-call-inside-the-component-seems-not-a-good-practise-to-handle-this/6984),我需要为组件提供模型,并保持控制器中的分页和其他操作的逻辑。哪个好。这是问题所在;

我的索引页面是unapprovedapproved页面的重复。可以免除表中可见的行数。如果我放置某些逻辑,例如'{1}}的“批准”,那么我将不得不为provider控制器和index控制器执行此逻辑。如何在保持干燥的同时分享这些功能?

快速说明,我原本以为我能够创建能够处理所有这些操作的自包含组件。因此,与pending相关的所有内容都将自包含在该组件中,以便我可以将其放在任何位置。我仍然认为这可能是一个有效的选择。

此问题已在http://discuss.emberjs.com/t/sharing-common-functionality-between-two-controllers/7632

的汇总讨论页面上交叉发布

1 个答案:

答案 0 :(得分:0)

我在ember services取得了很大成功,主要用于管理用户的某种全局可访问状态,但也用于调用非规范外部API或库更具适应性。

以下是我用来制作会话服务的生成命令(在ember-cli 1.13.7 +上):

ember generate initializer session
ember generate service session

然后在结果文件中(再次使用ember-cli样式)

// inside initializers/session.js
export function initialize(container, application) {
    // add this service to all routes
    application.inject('route', 'session', 'service:session');
}

export default {
    name: 'session',
    after: 'store',

    initialize: initialize
};

并且

// inside services/session.js
import Ember from 'ember';

export default Ember.Service.extend({

    init: function () {
        // init called automatically
        console.info('Session::Service init()');
    },
    read: function () {
        // sample service function
    }

    // ... your code here
});

稍后在路线中使用它(在这种情况下它被添加到所有这些中):

// inside routes/index.js
import Ember from 'ember';

export default Ember.Route.extend({

    setupController: function () {
        this.get('session').read();
    }
});