Совместное использование общих функций между двумя контроллерами, способ Ember.js 2.0

Прямо сейчас у меня есть ресурс 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-pro, approved-pro и так далее, которые использовали ember-table для отображения вещей в таблице. Я думал, что сделаю эти компоненты самодостаточными, чтобы они извлекали данные, получали следующую страницу, а также другие действия (например, удаление или обновление)

Теперь, прочитав вокруг (http://discuss.emberjs.com/t/how-to-make-ember-component-fetch-data-from-server-put-ajax-call-inside-the-компонент-кажется-не-хорошая-практика-обрабатывать-это/6984), мне нужно снабдить компоненты моделями и также сохраните логику нумерации страниц и других действий в контроллерах. Что нормально. Вот в чем проблема;

Моя индексная страница является копией unapproved и approved страниц. За исключением, возможно, количества видимых в таблице строк. Если я поставлю определенную логику, например «одобрить» provider, тогда мне придется проделать эту логику как для контроллера index, так и для контроллера pending. Как я могу поделиться этими функциями, сохранив при этом СУХОЙ?

Небольшое замечание: изначально я думал, что смогу создать автономные компоненты, которые будут обрабатывать все эти действия. Таким образом, все, что связано с unapproved_pro, будет автономно в этом компоненте, чтобы я мог поместить его куда угодно. И я все еще думаю, что это могут быть допустимые варианты.

Этот вопрос был размещен на странице обсуждения ember по адресу http://discuss.emberjs.com/t/sharing-common-functionality-between-two-controllers/7632


person Tolga E    schedule 26.03.2015    source источник


Ответы (1)


Я добился больших успехов с службами ember, в основном для управления какими-то глобально доступное состояние пользователя, но также для того, чтобы сделать вызовы нестандартных внешних 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();
    }
});
person Cameron    schedule 16.08.2015