Scenariusz kątowy działa dobrze, gdy aplikacja kątowa jest gotowa do pracy w DOM. Nie jest tak w przypadku używania requirejs lub innej biblioteki AMD. Jak dodać obsługę AMD w scenariuszu kątowym?Jak używać scenariusza kątowego z requirejs
Odpowiedz
To, co musisz zrobić, to przesłonić domyślne zachowanie się ramki i wydać nowe wydarzenie, kiedy aplikacja jest gotowa.
Pierwszą rzeczą jest dodanie następujących linii w swoim kanciastym zastosowaniu wraz z wywołaniem angular.bootstrap. Te dane są wymagane przez scenariusz kątowy.
angular.bootstrap(document, ['app']);
var html = document.getElementsByTagName('html')[0];
html.setAttribute('ng-app', 'app');
html.dataset.ngApp = 'app';
if (top !== window) {
top.postMessage({
type: 'loadamd'
}, '*');
}
Następnie, w swoim biegunie e2e, musisz uwzględnić te linie. Jeśli jest to skrypt zewnętrzny, musi być załadowany po kątowym-scenariuszem i musi być analizowany przed DOM jest gotowy:
/**
* Hack to support amd with angular-scenario
*/
(function() {
var setUpAndRun = angular.scenario.setUpAndRun;
angular.scenario.setUpAndRun = function(config) {
if (config.useamd) {
amdSupport();
}
return setUpAndRun.apply(this, arguments);
};
function amdSupport() {
var getFrame_ = angular.scenario.Application.prototype.getFrame_;
/**
* This function should be added to angular-scenario to support amd. It overrides the load behavior to wait from
* the inner amd frame to be ready.
*/
angular.scenario.Application.prototype.getFrame_ = function() {
var frame = getFrame_.apply(this, arguments);
var load = frame.load;
frame.load = function(fn) {
if (typeof fn === 'function') {
angular.element(window).bind('message', function(e) {
if (e.data && e.source === frame.prop('contentWindow') && e.data.type === 'loadamd') {
fn.call(frame, e);
}
});
return this;
}
return load.apply(this, arguments);
}
return frame;
};
}
})();
Wreszcie, aby umożliwić AMD konfigurację, należy dodać atrybut NG-useamd do kątowa -skrypt skryptu scenario.
<script type="text/javascript" src="lib/angular-1.0.3/angular-scenario.js" ng-autotest ng-useamd></script>
Jesteś teraz gotowy do
testowane kątowe-scenariusz v1.0.3
Powyższa odpowiedź nie powiodła się częściowo w moim scenariuszu (kątowa 1.1.4, świeże Karma). W widoku debugowania działało poprawnie, na normalnej stronie przeglądu nie powiodło się. Zauważyłem dodatkowy zagnieżdżony.
Zmieniłem kod na wiadomość na nadrzędną ramkę iframe testowanej aplikacji.
if (top !== window) {
window.parent.postMessage({
type: 'loadamd'
}, '*');
}
Tak, to dobra uwaga. Karma tworzy kolejną ramkę, która obejmuje ramę scenariusza kątowego, która obejmuje ramkę aplikacji. Tak więc w tym przypadku jest to ramka nadrzędna, a nie górna. – Francis
Przyjęta odpowiedź jest absolutnie poprawna, ale wstyd, że musisz umieścić ten kod na swojej stronie.
Tak więc, jeśli to pomaga, stworzyłem preprocesor dla karmy, aby wstrzyknąć "poprawkę" jako część testu.
Kod: https://github.com/tapmantwo/karma-ng-bootstrap-fix-preprocessor npm: https://www.npmjs.org/package/karma-ng-bootstrap-fix-preprocessor
Uwaga, to działa tylko jeśli służą pliki poprzez karmy. Jeśli używasz proxy, nie przechodzą przez preprocesor. Jako alternatywę mam rozwidlenie scenariusza ng, który robi coś podobnego, aby umożliwić ręczne uruchamianie stron do uruchomienia;
https://github.com/tapmantwo/karma-ng-scenario
To nie jest modułem węzła, więc musisz ustawić go ręcznie, ale jego lepsze (moim skromnym zdaniem), aby mieć coś takiego w miejscu zamiast zainfekowania kod produkcyjny z czymś po prostu dostać testy do zaliczenia.
- 1. Jak używać kątowego 2 z sprężynowym butem
- 2. Jak używać kątowego 1.3.4 i kątowego 2 razem
- 3. Jak używać materiału kątowego z szablonami SPA VS2017
- 4. RequireJS: kiedy używać "ścieżek" zamiast "pakietów"
- 5. Jak używać materiału kątowego (https://material.angularjs.org) w aplikacjach Angular 2
- 6. Kiedy używać Requirejs i kiedy używać dołączonego javascript?
- 7. Jak używać modułów globalnych NodeJS w modułach RequireJS
- 8. Jak używać RequireJS do ładowania i uruchamiania modułów tylko raz
- 9. Używanie Meteor z Requirejs
- 10. Ponowne uruchamianie scenariusza WPF
- 11. Konfigurowanie modułów z RequireJS przy konfiguracji zależy od RequireJS
- 12. Wiele skryptów z requirejs
- 13. Angular2 z RequireJS
- 14. Próba zainicjowania kontrolera widoku z zestawu scenariusza
- 15. Dodawanie scenariusza do istniejącego projektu
- 16. Jak sprawić, by SignalR działał z RequireJS?
- 17. Jak załadować nokaut.waluacji z nokautem w requirejs
- 18. Jak zrobić moduł requirejs z wieloma plikami
- 19. Jak obsłużyć kod liniowy z Optymalizacją RequireJS
- 20. Jak obsługiwać zależności cykliczne z RequireJS/AMD?
- 21. Jak uzyskać prawdziwe błędy z requirejs?
- 22. Jak załadować niestandardowe funkcje KnockoutJS z RequireJS?
- 23. Najlepszy wzór dla następnego scenariusza
- 24. Czy powinienem używać materiału dla kątowego lub materiału dla AngularJS?
- 25. Aplikacja internetowa z pakietami backbone.js i requirejs, optimizer requirejs
- 26. wykresy kątowe nie działają z requirejs
- 27. Jak zbudować przy użyciu zegarka z włączoną funkcją kątowego-cli?
- 28. Jak uzyskać dostęp do zakresu kątowego z przycisków dialogowych jQuery?
- 29. phantomjs i requirejs
- 30. Przykład Squire.js z Jasmine i RequireJS
Czy masz szansę na reaktywację githuba lub skrzypce? –
Wielkie dzięki Francis. Wystarczy pamiętać, że jeśli dołączasz JQuery do strony biegacza z jakiegokolwiek powodu, musisz odrzucić zdarzenie wiadomości, kiedy nadejdzie, np .: if (e.originalEvent) e = e.originalEvent; –