2015-05-21 10 views
0

У меня есть компонент, который объединяет 2 сторонних библиотеки, imagesLoaded и Isotope.Не могу понять, как обернуть функцию в цикле цикла Ember

Я получаю противоречивые тестовые сбои при выполнении тестов в браузере и режиме cli. Ошибка:

Error: Assertion Failed: You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in a run

или

TypeError: 'undefined' is not an object (evaluating 'self.$().isotope')

Когда я пытаюсь обернуть обратные вызовы в цикле уголька выполнения, они проходят в режиме CLI-, но затем не в режиме браузера. Кажется, я не вижу правильной комбинации. Проблема, похоже, происходит в обратном вызове imagesLoaded, как будто я удаляю этот плагин, кажется, что он прошел отлично.

Я пробовал несколько комбинаций, но вот мой последний код. Если кто-нибудь знает, как правильно использовать цикл цикла в этом компоненте, это будет полезно.

handleLoad: function() { 
    let self = this; 

    Ember.run.scheduleOnce('afterRender', this, function(){  
    self.$().imagesLoaded(function() { 

     Ember.run(function() { 
      self.$().isotope({itemSelector: ".card-container"}); 
      self.$().isotope('shuffle'); 
     }); 

    }); // imagesLoaded 
    }); // Ember.run 

}.on('didInsertElement') 

ответ

0

Вы должны обернуть существующий код в

Ember.run(function() { 
// Ember.run.scheduleOnce('afterRender.... 
}); 

, как это говорит Ember, где начинается цикл запуска и заканчивается - в производство/развитие это делается для вас самой Эмбер, но при тестировании вы должны его обернуть.

В качестве альтернативы вы можете начать & закончить цикл выполнения вручную, вызвав его в явном виде (см API Docs):

Ember.run.begin() // <-- tell Ember that your starting a run loop 

//Ember.run.scheduleOnce('afterRender', ... 
//more ember run loops here 

Ember.run.end(); // <-- tell Ember that the run loop ends here