Завършено събитие за преход и изобразяване на Ember

Има ли задействано събитие, което посочва, че преходът/изобразяването е завършено (и домът е видим/готов).

setupcontroller/activate са преди dom да бъде построен/рендиран

didInsertElement се задейства само първия път, когато вече съм вмъкнал елемент и просто превключвам модела под него.

Това, което наистина търся, е събитието за прехода

Предполагам, че мога да направя това, но донякъде се надявах, че вече е вградено...

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

Още по-готино би било обратно извикване към маршрута, който преходът завърши за него, може да се наложи да напиша това и да изпратя заявка за изтегляне.


person Kingpin2k    schedule 02.07.2013    source източник
comment
погледнете тази същност gist.github.com/machty/5723945 промените, описани там, са вече в RC6   -  person intuitivepixel    schedule 03.07.2013
comment
Да, видях това. Това помогна частично, единственият проблем беше, че можех да стартирам код след прехода, но това все още не е след като беше вмъкнат в dom.   -  person Kingpin2k    schedule 12.07.2013


Отговори (4)


Има няколко различни начина, по които можете да разрешите това

didInsertElement

Това се задейства, когато изгледът се вмъкне за първи път, но не се задейства, ако моделът е изключен под изгледа (защото Ember обича да използва повторно елементи, тъй като е по-евтино от повторното изграждане на целия 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
    });
})
person Kingpin2k    schedule 22.08.2013
comment
За информация: предаването на анонимни функции в scheduleOnce няма да го планира веднъж, тъй като проверява препратката към функцията, за да види дали вече е планирано. Ще трябва да дефинирате функцията някъде статично (като в обекта), така че да е: Ember.run.scheduleOnce('afterRender', this, this.myStaticFunction) - person Ben Lesh; 11.08.2014
comment
Да, чудесен въпрос, по времето, когато писах, не знаех за това и не съм направил достатъчно почистване в отговорите си. Страхотна точка и актуализирана, за да не създава грешно впечатление. Това е вярно и за намаляването на отскока и газта (и често неразбрано) - person Kingpin2k; 12.08.2014
comment
могат ли компонентите да слушат събития renderComplete? - person SuperUberDuper; 16.03.2015

Куката 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

person Rocky    schedule 21.08.2013
comment
Това разрешение на обещанието е най-добро за знанието, че преходът е завършен. Перфектен за извикване на свойствата на контролера в изгледите и знанието, че имате правилния модел. - person Matthew Blancarte; 23.11.2013
comment
Благодаря, точно това ми трябваше. Работи страхотно в Ember 1.7.0. - person rog; 16.10.2014
comment
Мога да те целуна точно сега. Моят afterModel правеше промени в модела на родителския контролер, но шаблонът не актуализираше новите данни. Преместих промяната в прехода и всичко е по-добре. - person colsen; 02.10.2015
comment
Не работи в последния Ember, доколкото виждам. Ако в afterModel(), се опитате да получите достъп до DOM елемента, който е в шаблона на рутера, той не съществува - person Epirocks; 04.08.2016

setupController е последното нещо, което рутерът извиква, преди да финализира прехода. И ако завърши без грешки, що се отнася до Ember, преходът е завършен. Всъщност виждате това в действие, като активирате LOG_TRANSITIONS_INTERNAL.

В този момент няма значение дали контролерът е извел грешка, изгледът е извел грешка и т.н. Рутерът е завършил прехода към целевия маршрут.

Така че setupController е последното място по отношение на рутера, което съответства на didTransition.

Когато съдържанието/моделът, поддържащ контролера, се промени в съществуващ изглед, обвързванията се включват. Повечето от промените, които се случват с изгледа в този момент, са чрез метаморфизиране.

Най-близкото място, за което се сещам да се закача, е View.render, което натиска промените в RenderBuffer. Но все пак трябва да отчетете метаморфизирането чрез миксини, което се случва тук.

person Darshan Sawardekar    schedule 03.07.2013
comment
За да бъда педантичен, бих казал, че setupController е първото нещо, което рутерът извиква след финализиране на прехода, въпреки че предполагам, че зависи от точната семантика, която присвоявате на думата finalize. - person ; 05.06.2015

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'),
person Gabe Rainbow    schedule 07.04.2015