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

Завершение перехода с помощью Ember

Произошло ли какое-либо событие с завершением перехода/рендеринга (и dom видимо/готово).

setupcontroller/activate - до того, как dom будет построен/отображен

didInsertElement запускается только в первый раз, когда я уже вставил элемент, и я просто переключаю модель под ним.

То, что я действительно ищу, - это событие завершено.

Думаю, я могу это сделать, но я вроде как надеялся, что он уже построен...

Ember.Router.reopen({
  didTransition:function(infos) {
     this._super(infos);
     console.log('transition complete');  
  }
});

Даже кулер будет обратным вызовом маршрута, который завершит переход для него, мне, возможно, придется написать это и отправить запрос на перенос.

4b9b3361

Ответ 1

Существует несколько способов решения этой проблемы.

didInsertElement

Это запускается, когда представление вставляется в первый раз, но не запускается, если модель отключена под представлением (потому что Эмбер любит повторное использование элементов, поскольку он дешевле, чем восстановление всей DOM). Пример ниже.

Простой

Если вам нужно сделать это один раз, при первом входе в просмотр используйте didInsertElement

App.FooView = Em.View.extend({
  setupSomething: function(){
    console.log('the dom is in place, manipulate');
  }.on('didInsertElement')
});

Пример: http://emberjs.jsbin.com/wuxemo/1/edit

Комплекс

Если вам нужно запланировать что-то после того, как DOM был отображен с самого маршрута, вы можете использовать schedule и вставить его в очередь afterRender.

App.FooRoute = Em.Route.extend({
  setupController: function(controller, model){
    this._super('controller', model);
    Ember.run.schedule('afterRender', this, function () {
      //Do it here
    });
  }
});

Пример: http://emberjs.jsbin.com/wuxemo/2/edit

обещание перехода

Перенос перехода завершится до того, как он закончит рендеринг элементов. Но это дает вам крючок, когда это делается с извлечением всех моделей и контроллеров и их подключением.

Если вы хотите подключиться к событию перехода, вы можете сделать это так:

var self = this;
transitionTo('foo').then(function(){
    Ember.run.schedule('afterRender', self, function () {
          //Do it here
    });
})

Ответ 2

Ключ afterModel может работать для вас:

App.MyRoute = Ember.Route.extend({
  afterModel: function(model, transition) {
    transition.then(function() {
      // Done transitioning
    });
  }
});

Я тестировал это с помощью RC-7 с маршрутами, которые выполняют и не имеют динамических сегментов (т.е. маршрут с моделью и маршрут без модели). Кажется, что это работает в любом случае.

Смотрите этот JSBin для примера RC-6:
  Выход: http://jsbin.com/OteC/1/
  Источник: http://jsbin.com/OteC/1/edit?html,js

Ответ 3

setupController - это последнее, что звонит маршрутизатор перед завершением перехода. И если он завершится без ошибок, то, что касается Ember, переход завершен. Фактически вы видите это в действии, включив LOG_TRANSITIONS_INTERNAL.

В этот момент не имеет значения, вызвал ли контроллер ошибку, просмотр сделал ошибку и т.д. Маршрутизатор завершил переход в целевой маршрут.

Итак, setupController - последнее место в терминах маршрутизатора, которое соответствует didTransition.

Когда содержимое/модель, поддерживающая контроллер, изменяется в существующем представлении, происходит перехват привязок. Большинство изменений, которые происходят с представлением в этой точке, выполняются через Metamorphing.

Самое близкое место, которое я могу придумать, было бы View.render, которое подталкивает изменения в RenderBuffer. Но вам все равно нужно учитывать Metamorphing через mixins, который здесь происходит.

Ответ 4

didTransition существует, как вы надеялись, но его действие, а не крючок

XXRouter
actions: {
    didTransition: function() {
        this.controller.set("hasTransitioned", true); // or whatever is needed?!
        return true; // Bubble the didTransition event
    },
}


XXController    
observeTransition: function() {
    alert('complete Transition');
}.observes('hasTransitioned'),