Ember организовывает маршруты и ресурсы?

Привет, ребята, у меня есть куча изображений, которые я хочу отсортировать по «Последние», «Популярные» или «Популярные».
На данный момент у меня есть маршрут, который определяется следующим образом:

App.Router.map(function () {
    this.route("browse");
});

Я хотел сделать что-то вроде просмотра/последних, чтобы показать изображения по последним и просмотреть/популярные для популярных, но я не могу вложить маршруты.

Должен ли я изменить свой код, чтобы вместо маршрута browse у него был ресурс images?
И вложить в него мои фильтры? так что у меня будет что-то вроде изображений/последних изображений/популярных...
Кажется, что слишком много маршрутов, может быть, в будущем у меня будет 10 фильтров. Значит ли это, что мне нужно создать 10 разных маршрутов и контроллеров? я не могу просто использовать 1 контроллер и установить логику для фильтрации (с ember-данными)?


person kfir124    schedule 08.06.2014    source источник


Ответы (2)


Вероятно, вам следует использовать существительное (images) в качестве имени ресурса. Затем вы можете создать несколько маршрутов, каждый из которых применяет разные фильтры к вашим данным (разные модели), но каждый использует один и тот же контроллер/шаблон. Упрощенный пример:

Сначала создайте ресурс изображений с отдельными маршрутами для ваших фильтров:

App.Router.map(function() {
  this.resource('images', function () {
    this.route('hot');
    this.route('new');
  });
});

Затем создайте общий маршрут, который будет использовать жестко заданный шаблон и контроллер. Часть с setupController необходима, потому что контроллер по умолчанию будет (вероятно, автоматически сгенерированным) контроллером для ImagesNew или ImagesHot. Вы должны взять данную модель и использовать ее для настройки общего ImagesController.

App.ImagesRoute = Ember.Route.extend({
    renderTemplate: function() {
      this.render('images', {
        controller: 'images'
      });
    },
    setupController: function (_, model) {
      this.controllerFor('images').set('content', model);
    }
});

App.ImagesController = Ember.Controller.extend({
  // your shared logic here
});

Наконец, вы можете создавать фильтрующие маршруты. Каждый из них должен наследовать базовый ImageRoute и предоставлять свои собственные отфильтрованные данные в обработчике модели.

App.ImagesHotRoute = App.ImagesRoute.extend({
    model: function () {
      return this.store.getHotImages();
    }
});

App.ImagesNewRoute = App.ImagesRoute.extend({
    model: function () {
      return this.store.getNewImages();
    }
});

Рабочий пример jsbin здесь.

person panta82    schedule 08.06.2014
comment
спасибо плохо читал о setupController и renderTemplate, кстати, зачем нам нужен пользовательский renderTemplate? - person kfir124; 08.06.2014
comment
Чтобы и ImagesHotRoute, и ImagesNewRoute использовали один и тот же контроллер и шаблон. В противном случае они использовали бы шаблоны images.new / images.hot и ImagesNewController / ImagesHotController. - person panta82; 08.06.2014

Рекомендуется начинать с ресурса, а затем вкладывать в него маршруты.

App.Router.map(function() {
  this.resource('images', { path: '/' }, function() {
    this.route('browse');
    this.route('hottest');
    this.route('popular');
  });
});

Что касается создания десяти разных контроллеров, в этом нет необходимости. Я полагаю, что логика маршрута будет другой (HottestRoute загрузит самые популярные фотографии, PopularRoute загрузит самые популярные), но логика контроллера должна быть той же. Вероятно, лучше иметь именованные контроллеры, но они могут просто расширять уже определенный control.

App.ImagesPopularController = ImagesController.extend();
person Ryan    schedule 08.06.2014