Подтвердить что ты не робот

Переход Ember JS к вложенным маршрутам, где все маршруты являются динамическими сегментами из представления

Мы пишем приложение с использованием EmberJS. Однако мы все еще новы в этой структуре, и нам трудно решить некоторые из того, что может показаться прямым.

Модель довольно проста: есть 3 модели: очередь, задача и изображение. Мы используем динамические сегменты URI для всех маршрутов, и маршруты для этих моделей вложены в форму: : queue_id/: task_id/: image_id.

Маршруты настроены таким образом:

App.Router.map(function() {
   this.resource('queue', {path: ':queue_id'}, function() {
      this.resource('task', {path: ':task_id'}, function() {
         this.resource('image', {path: ':image_id'});
      });
   });
}

И где-то в HTML, у нас есть этот простой шаблон для повторения всех изображений из задачи:

{{#each task.images}}
   <li>
      {{#view App.ThumbnailView.contentBinding="this"}}
         <img {{bindAttr src="thumbnail.url"}} />
      {{/view}}
   </li>
{{/each}}

И вот код для Thumbnail View:

App.ThumbnailView = Ember.View.extend({
   tagName : 'a',
   click : function(e) {
       var task = //assume this value exists;
       var queue = //assume this value exists;
       var image = //assume this value exists;

       this.get('controller.target.router').transitionTo('image', queue, task, image);
   }
});

Наконец, вот наш ImageRoute:

App.Image = Ember.Object.extend();
App.Image.reopenClass({
    find : function(image_id) {
       //This is where I set a breakpoint
       console.log(image_id);
    }
});

App.ImageRoute = Ember.Route.extend({
    model : function(params) {
      //image_id is the last uri segment in: #/1/1/1
      return App.Image.find(params.image_id);
    }
});

Проблема: Вызов this.get('controller.target.router').transitionTo(), похоже, работает. Я вижу, что когда я нажимаю один из изображений эскизов, URL изменяется (например, от /1/1/2 до чего-то вроде /1/1/3). Однако я не вижу изменений в пользовательском интерфейсе. Кроме того, строка, в которой я помещаю точку останова, кажется, не срабатывает. Но когда я обновляю страницу, она работает хорошо.

Что-то не так с моим кодом перехода?

Спасибо.

4b9b3361

Ответ 1

Следует отметить две вещи:

Сначала вместо

this.get('controller.target.router').transitionTo('image', queue, task, image);

Использование:

this.get('controller').transitionToRoute('image.index', queue, task, image);

Это может не изменить поведение, но оно более опасно идиоматично.

Во-вторых, следующее:

Внутренние переходы не вызовут крюк model на маршруте, потому что Ember предполагает, что вы передаете модель вместе с переходом, поэтому нет необходимости вызывать hook model, поскольку вы уже прошли модель.

Вот почему ваша точка останова не срабатывает, find не вызывается (как и не должно).

У меня недостаточно информации для поиска вашей проблемы, но если я должен угадать из-за того, что обновление страницы работает, а внутренний переход не является тем, что существует несогласованность между объектами, переданными в transitionTo и между тем, что возвращается с помощью model hook.

Вы должны передать точный объект в transitionTo как те, которые были бы возвращены крюком model.

Если вы делаете:

this.get('controller').transitionToRoute('image.index', queue, task, image);

и он не работает, возможно, что-то, вероятно, неверно в моделях queue, task или image, которые вы передаете.

Итак, это:

   var task = //assume this value exists;
   var queue = //assume this value exists;
   var image = //assume this value exists;

не очень помогает, потому что это может быть проблема.