2015-03-13 9 views
8

Ich habe Staaten wie unten in meiner angularjs App mit eckigen ui Router State Provider definiert. Und ich würde gerne mehrere Zustände mit der gleichen Konfiguration definieren, dh. mit der gleichen Vorlage und Controller.eckig ui router state - mehrere states mit der gleichen Vorlage und controller

$stateProvider 
     .state('parent', { 
      templateUrl: 'parent.html', 
      abstract: true, 
      parent: 'apm' 
     }) 
     .state('parent.list', { 
      abstract: true, 
      url: '/list', 
      templateUrl: 'list.html', 
      controller: 'ListCtrl' 
     }) 

     .state('parent.list.closed', { 
     url: '/q', 
     templateUrl: 'closed.html' 
     }) 

     .state('parent.list.details', { // would like to have same template, controller on different state parent.details without list 
      url: '/:id/:name', 
      abstract: true, 
      templateUrl: 'details.html', 
      controller: 'DetailsCtrl', 
      resolve: { 
       ..... 
       ..... 
      } 
     }) 
     .state('parent.list.details.data', { // would like to have same template, controller on different state parent.details.data without list 
      url: '/details', 
      views : { 
      'view1' : { 
       templateUrl : 'view1.html' 
      }, 
      'view2' : { 
       templateUrl : 'view2.html', 
       controller : 'View2Ctrl' 
      }, 
      'view3' : { 
       templateUrl : 'view3.html' 
      }, 
      'view4' : { 
       templateUrl : 'view4.html' 
      } 
      } 
     }) 

Ist es möglich, so etwas wie

.state(['parent.list.details', 'parent.details'], { 
      url: '/:id/:name', 
      abstract: true, 
      templateUrl: 'details.html', 
      controller: 'DetailsCtrl', 
      resolve: { 
       ..... 
       ..... 
      } 
     }) 

Jede Hilfe oder Anregungen zu tun?

+0

warum Sie nicht über die allgemeinen Optionen zu einem einfachen extrahieren javaScript-Variable oder ev de eine Winkelkonstante? Ich nehme an, du machst es, um Sake auszutrocknen, oder? – goreorto

Antwort

7

Jeder Status muss in seiner eigenen .state() Methode definiert werden. Sie werden mehrere Probleme haben, wenn Sie versuchen, es so zu tun, wie Sie oben aufgelistet haben. Am wichtigsten wäre die URL.

Sie können dies einfach tun:

.state('parent.list', { 
     url: '/list', 
     abstract: true, 
     templateUrl: 'details.html', 
     controller: 'DetailsCtrl', 
     resolve: { 
      ..... 
      ..... 
     } 
    .state('parent.list.details', { 
     url: '/:id/:name', 
     abstract: true, 
     templateUrl: 'details.html', 
     controller: 'DetailsCtrl', 
     resolve: { 
      ..... 
      ..... 
     } 
    }) 

Während der Code nicht kondensiert oder effizient in dem Sinne, Sie auf jeden Zustand der Steuerung und teilweise gebrauchte zu erklären haben, ist es notwendig, da jeder Staat seine eigenen Bedürfnisse .state() Methode

+0

Danke für die schnelle Antwort. Meine einzige Sorge war, eine Reihe von Codezeilen für die neuen Zustände zu wiederholen, die ich möchte. – user3701057

+0

Ja, wie ich sagte, es ist nicht das effizienteste, aber weil uiRouter erfordert, dass die '.state()' Methode für jeden Zustand deklariert wird, sehe ich keinen Weg darum herum. Hier ist ein Zitat direkt aus dem Wiki von uiRouter: _ "Staaten haben oft Dinge gemeinsam, und der Hauptweg, diese Gemeinsamkeiten in diesem Modell herauszufiltern, ist über die Staatshierarchie, d.h. Eltern/Kind-Zustände aka verschachtelte Zustände." –

+0

Wenn der gleiche Controller mit verschiedenen Zuständen verbunden ist, dann werden die Funktionen, die auf bind ausgeführt werden, wie: die Liste vom Server abrufen immer wieder aufgerufen, das ist, was ich jetzt im Problem bin. Was könnte eine mögliche Lösung sein? – 89n3ur0n

3

wollte ich gleich und machte es wie folgt aus:

//add a new Function to the object $stateProvider 
       $stateProvider.states = (statesArr, obj) => { 

        for (var i in statesArr) { 
         var state = statesArr[i]; 

         $stateProvider.state(state, obj); 
        } 

        return $stateProvider; 
       }; 


//use the new function 
       $stateProvider 

       .states(["main", "main.test"], { 
        url: '/main', 
        templateUrl: 'modules/ViewContainer.html', 
        controllerAs: 'currentCtrl', 
        controller: 'MainCtrl' 
       }) 
+1

funktioniert gut, ich musste das Zustandsobjekt klonen, damit es mit $ state.go ('^. Mystate') funktioniert; Beispiel mit Unterstreichung: $ stateProvider.state (state, _.clone (obj)); – dam1

Verwandte Themen