2016-05-18 9 views
0

Ich versuche, Best Practices mit einer AngularJs 1.5 App zu verabschieden. Bereits folgende Todd Motto's und John Papa's Stil führtWie wird empfohlen, eine gekapselte Direktive und Routing in einer AngularJS-App zu verwenden?

Die Sache ist die: meine app hat Routen mit ngRoute. Also, das:

function RoutingConfig($routeProvider) { 
    $routeProvider 
     .when('/route1', { 
      controller: 'Ctrl1 as vm', 
      templateUrl: 'partials/route1.html', 
      resolve: { myCoolService: myCoolService } // to abbreviate 
     }) 
     .when('/route2', { 
      controller: 'Ctrl2 as vm', 
      templateUrl: 'partials/route2.html' 
     }) 
     .otherwise({redirectTo: '/route1'}): 

} 

angular 
    .module('myApp', ['ngRoute']) 
    .config(RoutingConfig); 

Ok. So weit, ist es gut. Jetzt

, lassen Sie uns sagen, dass in meinem Weg nach Angular 2, ich die kapseln alles in einer Richtlinie Ansatz verabschieden wollen. Auf diese Weise erstelle ich etwas wie Web-Komponenten mit AngularJS 1.5.

Wenn ich die richtigen Praktiken folgende bin, konnte ich eine Richtlinie für meine route1 erstellen und direkt einen Controller für diese Richtlinie definieren:

function MyCoolDirective() { 
    var directiveDefObj = { 
     controller: Ctrl1, 
     controllerAs: 'vm', 
     scope: { 
      data: "=", 
     }, 
     bindToController: true, // isolated scope 
     link: linkFnc // just declared to abbreviate 
    }; 

    return directiveDefObj; 
} 


angular 
    .module('myApp') 
    .directive('MyCoolDirective', MyCoolDirective); 

So wo soll ich die Controller erklären? In der Routing-Konfiguration? In jeder Richtlinie? Klingt ein bisschen redundandt für mich.

+0

gibt es hier tatsächlich zwei separate Controller; eine für die Route und alles in ihrer Vorlage, die andere für die Direktive und alles in ihrer Vorlage. Wenn Sie jedoch beabsichtigen, dass die Routenvorlage nur Anweisungen enthält und keine eigene Logik verwendet, ist es nicht erforderlich, einen Controller bereitzustellen. In der Praxis werden Sie jedoch wahrscheinlich beides benötigen, insbesondere wenn Sie mehrere Direktiven planen, die Informationen untereinander austauschen. – Claies

+0

Sie brauchen keine Route Controller mehr. Sie können einfach die Vorlage für Ihre Route eine Direktive machen und all Ihre Controllerlogik in die Direktive einfügen. z.B. '.when ('/ route1', {template: ''})' – rob

+0

Ja, das ist meine Idee: verschiebe die Komplexität in Direktiven und habe keine Routing-Controller, wenn möglich. Um die Kommunikation zwischen Direktiven (typisches Beispiel der äußeren Direktive für einen Container und innere Direktive für jedes der enthaltenen Elemente) zu handhaben, konnte ich nicht einfach 'require' in meinen inneren Direktiven verwenden? – jorgeas80

Antwort

1

Arbeiten mit dem Beispiel, das ist, wie ich Controller in Richtlinien ala den Papa Style Guide Griff

Wie oben erwähnt empfehle ich die neue Winkel 1,5 Komponentenverfahren in die Vorbereitungen für Winkel 2. https://docs.angularjs.org/guide/component

Check-out
(function() { 
    angular 
     .module('AppName') 
     .directive('directiveName', directiveName) 
     .config(routeConfig); 

    directiveName.$inject = ['$compile']; 

    function directiveName($compile) { 
     return { 
      scope: { 
       customAttribute: '=', 
      }, 
      link: directiveLink, 
      controller: directiveController 
     }; 

     function directiveLink(scope) { 

     } 

     function directiveController($scope) { 

     } 
    } 
    routeConfig.$inject ['$routeProvider']; 

    function routeConfig($routeProvider) { 
     $routeProvider.when('/home', { 
      template: '<custom-directive></custom-directive>', 
      resolve: { 
       user: function($http) { return $http.get('...'); } 
      } 
     }); 
    } 
})(); 
+0

Vielen Dank! Das ist ziemlich sauber. Ich benutze manchmal 'Komponente' anstelle von 'Direktive', aber ich bereite Material für eine AngularJS-Klasse vor und wollte die Evolution zeigen, um die Verwendung von 'Komponente' zu verstehen, und warum wir dort angekommen sind. – jorgeas80

+0

Nur eine andere Frage: Sie haben $ compile in die Direktive injiziert. Wofür würden Sie es verwenden? Wenn ich nicht falsch liege, können Sie damit das DOM der Direktive vor seiner Instantiierung ändern, anders als bei der Link-Funktion. Gibt es dafür einen klaren Anwendungsfall? – jorgeas80

+0

Verwenden Sie kompilieren, um eckig zu erlauben, "seine Sache zu tun". Genauer gesagt, kompilieren ist, was Winkel verwendet, um Vorlagen zu rendern. Mit dem Kompilieren können Sie neue Bereiche erstellen und sie im Handumdrehen an Vorlagen binden. Betrachten Sie Folgendes: https: //gist.github.com/d3l33t/87adc735266077c2af3840e1a115c1c4 Ich kann kompilieren, um neue Elemente auf der Seite zu erstellen, die über eine Zwei-Wege-Datenbindung an den übergeordneten Bereich verfügt. Ich kann Funktionen im übergeordneten Bereich erstellen und ermöglichen, dass untergeordnete Anweisungen unabhängig voneinander funktionieren. – d3l33t

Verwandte Themen