2015-03-13 15 views
8

Tôi đã tiểu bang được xác định như sau trong ứng dụng angularjs tôi sử dụng nhà cung cấp nhà nước ui Router góc. Và, tôi muốn xác định nhiều trạng thái với cùng một cấu hình tức là. với cùng một mẫu và bộ điều khiển.góc nhà nước ui router - nhiều quốc gia với cùng một mẫu và điều khiển

$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' 
      } 
      } 
     }) 

Có thể làm điều gì đó như

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

Bất kỳ sự giúp đỡ hoặc gợi ý?

+0

tại sao bạn không giải nén các tùy chọn chung cho một đồng bằng javascript biến hoặc ev vi một hằng số góc? Tôi đoán bạn đang làm để làm khô sake, phải không? – goreorto

Trả lời

7

Mỗi tiểu bang cần phải được xác định trong phương pháp .state() riêng của nó. Bạn sẽ gặp phải nhiều vấn đề khi cố gắng thực hiện theo cách bạn đã liệt kê ở trên. Quan trọng nhất sẽ là url.

Bạn chỉ có thể làm điều này:

.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: { 
      ..... 
      ..... 
     } 
    }) 

Trong khi mã được chưa cô đặc hoặc hiệu quả theo nghĩa bạn phải khai báo bộ điều khiển và một phần được sử dụng trên mỗi tiểu bang, nó là cần thiết vì mỗi tiểu bang cần riêng của mình .state() phương pháp

+0

Cảm ơn bạn đã phản hồi nhanh. Mối quan tâm duy nhất của tôi là lặp lại nhiều dòng mã cho các bang mới mà tôi muốn. – user3701057

+0

Ừ như tôi đã nói nó không phải là hiệu quả nhất nhưng vì uiRouter đòi hỏi '.state() 'phương pháp phải được khai báo cho mỗi tiểu bang tôi không thấy một cách xung quanh nó. Dưới đây là một trích dẫn trực tiếp từ wiki uiRouter của _ "Hoa thường có điểm chung, và cách chính của Sacombank ra những điểm tương đồng trong mô hình này được thông qua hệ thống phân cấp nhà nước, ví dụ: phụ huynh/bang con bang aka lồng nhau." –

+0

nếu cùng điều khiển được liên kết với các quốc gia khác nhau, sau đó các chức năng mà thực thi trên ràng buộc như: nhận danh sách từ máy chủ sẽ được gọi một lần nữa và một lần nữa, đó là những gì tôi đang ở vấn đề bây giờ. Điều gì có thể là một giải pháp khả thi? – 89n3ur0n

3

tôi muốn giống nhau và làm cho nó như thế này:

//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

làm việc tuyệt vời, tôi đã phải sao chép đối tượng trạng thái để làm cho nó hoạt động với $ state.go ('^. Mystate'); ví dụ với gạch: $ stateProvider.state (nhà nước, _.clone (obj)); – dam1

Các vấn đề liên quan