Porównaj ceny domen i usług IT, sprzedawców z całego świata

Angular dodaje moduły po angular.bootstrap


Używam meteor + kąt. Moim zamiarem jest dodanie większej ilości zależności po załadowaniu aplikacji (to dlatego, że pakiet obsługuje bootstrap na początku i nie mam nad nim dużej kontroli). Teraz chciałbym przy tym zastosować podstawową strukturę kodu, w której np. Skompilowałbym wszystkie kontrolery w jednym module.
Oto podstawowa idea:
'use strict';angular.module('app.controllers', []) .controller('MainCtrl', function() {
// ...
}) .controller('SubCtrl', function() {
// ...
}) .controller('AnotherCtrl', function() {
// ...
});

Następnie umieść to w swoim głównym module jako zależność:
angular.module('app', [
'app.filters',
'app.services',
'app.directives',
'app.controllers'// Here
]);

Po kilku badaniach stwierdziłem, że to, co próbuję zrobić (dodawanie zależności po załadowaniu), jest w rzeczywistości częścią żądania funkcji do polecenia kątowego. Tak więc moja wersja wykorzystuje na przykład funkcje
$ controllerProvider
i
register ()
:
Meteor.config(function($controllerProvider) {
$controllerProvider.register('MainCtrl', function($scope) {
// ...
});
});Meteor.config(function($controllerProvider) {
$controllerProvider.register('SubCtrl', function($scope) {
// ...
});
});Meteor.config(function($controllerProvider) {
$controllerProvider.register('AnotherCtrl', function($scope) {
// ...
});
});

To działa, choć nie tak elegancko. Oto pytania:
  • Jaki jest bardziej elegancki sposób utworzenia części
    config
    i
    register
  • Czy zamiast tego można zarejestrować moduł

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Stwórz swój moduł:
angular.module('app.controllers', []);

Dodaj go jako zależność:
angular.module('app').requires.push('app.controllers');
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jedyną metodą, jaką widziałem, która działa, jest zastąpienie funkcji
angular.module
własną funkcją, która zwraca moduł użyty do załadowania aplikacji.
var myApp = angular.module('myApp', []); 
angular.module = function() {
return myApp;
}

W ten sposób wszystkie moduły, które są później rejestrowane, są faktycznie rejestrowane w module
myApp
.
Ta technika, w połączeniu z tą, którą opisałeś w pytaniu (używając dostawców takich jak
$ controllerProvider
), pozwoli Ci dodać „moduły” po
angular.bootstrap
.

Demonstracja

Zobacz to jsfiddle, aby zobaczyć demo:

https://jsfiddle.net/josketres/aw3L38r4
https://jsfiddle.net/josketres/aw3L38r4/
/

niedogodności

  • Bloki
    Config
    Moduły dodane po
    Angular.Bootstrap
    nie zostaną wywołane. Może jest sposób, aby go naprawić, ale go nie znalazłem.
  • Zastępowanie
    angular.module
    jest jak brudny hack.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

zgodnie z

Ta prezentacja
http://www.slideshare.net/nirk ... iques
(slajd 12) możesz przypisać
controllerProvider
do aplikacji.

Przykład zamiany metody modułu
controller

:

http://jsfiddle.net/arzo/HB7LU/6659
http://jsfiddle.net/arzo/HB7LU/6659/
/
var myApp = angular.module('myApp', []);//note overriding controller method might be a little controversial :D 
myApp.config(function allowRegisteringControllersInRuntime($controllerProvider) {
var backup = myApp.controller;
myApp.controller = $controllerProvider.register;
myApp.controller.legacy = backup;
})myApp.run(function ($rootScope, $compile) { myApp.controller('MyCtrl', function($scope) {
$scope.name = 'Superhero';
}) var elem;
var scope=$rootScope;
elem = $compile('<p ng-controller="MyCtrl">{{name}}</br><input ng-model="name"/>')($rootScope, function (clonedElement, scope) {
console.log('newly created element', clonedElement[0])
document.body.appendChild(clonedElement[0]);
});
console.log('You can access original register via', myApp.controller.legacy);
})

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się