2014-07-04 34 views
15

Tôi vừa mới bắt đầu học angularj và tôi đang sử dụng angular-ui-router. Tôi đang cố gắng gửi dữ liệu từ trạng thái này sang trạng thái khác bằng cách sử dụng $state.go nhưng tôi không thành công. Dưới đây là những gì tôi có cho đến thời điểm này:Góc giao diện người dùng-Router truyền dữ liệu giữa các trạng thái có chức năng đi không hoạt động

Tôi chưa bao gồm html một cách có chủ ý vì tôi cho rằng nó không cần thiết nếu cần, vui lòng cho tôi biết và tôi sẽ thêm nó.

Tôi đã cấu hình trạng thái của tôi như sau:

$stateProvider 
     .state('public', { 
      abstract: true, 
      templateUrl: 'App/scripts/main/views/PublicContentParent.html' 
     }) 
     .state('public.login', { 
      url: '/login', 
      templateUrl: 'App/scripts/login/views/login.html', 
      controller: 'loginCtrl' 
     }) 

    $stateProvider 
     .state('private', { 
      abstract: true, 
      templateUrl: 'App/scripts/main/views/PrivateContentParent.html' 
     }) 
     .state('private.visits', { 
      url: '/visits', 
      views: { 
       'main': { 
        controller: 'visitsListCtrl', 
        templateUrl: 'App/scripts/visits/views/VisitsList.html' 
       } 
      } 
     }); 

Khi tôi LoginController được gọi nó sẽ thực thi mã bên dưới:

loginModule.controller('loginCtrl', ['$state', function ($scope, $state) { 

    $state.go('private.visits', { name : "Object"}); 

}]); 

Khi trang private.visits đang hoạt động, tôi đang cố gắng để in số $stateParams:

visitsModule.controller('visitsListCtrl', ['$stateParams', 
    function ($stateParams) { 

     console.log($stateParams); 


    }]); 

Vì mọi thứ nhà nước $ stateParams là một đối tượng trống. Tôi mong đợi nó để chứa các đối tượng tôi đã thông qua trong loginCtrl.

EDIT

Dường như nếu private.visits url có dạng url này '/visits/:name' và tôi cũng thêm params sở hữu: [ "name"] Tôi được tiếp cận với các đối tượng tôi gửi từ trạng thái public.login. Tác dụng phụ là các thông số được thêm vào url hợp lý.

Tôi đã thử làm điều tương tự với trạng thái con không có url và trong trường hợp này có vẻ như tôi không có quyền truy cập vào thông số tôi đã chuyển từ public.login.

Làm cách nào để gửi dữ liệu ở trạng thái con?

Trả lời

27

Những gì bạn phải làm là để xác định name param trong private.visits nhà nước như:

$stateProvider 
    .state('public', { 
     abstract: true, 
     templateUrl: 'App/scripts/main/views/PublicContentParent.html' 
    }) 
    .state('public.login', { 
     url: '/login', 
     templateUrl: 'App/scripts/login/views/login.html', 
     controller: 'loginCtrl' 
    }) 

$stateProvider 
    .state('private', { 
     abstract: true, 
     templateUrl: 'App/scripts/main/views/PrivateContentParent.html' 
    }) 
    .state('private.visits', { 

     // NOTE! 
     // Previously, we were only passing params as an array 
     // now we are sending it as an object. If you 
     // send this as an array it will throw an error 
     // stating id.match is not a function, so we updated 
     // this code. For further explanation please visit this 
     // url http://stackoverflow.com/a/26204095/1132354 
     params: {'name': null}, 

     url: '/visits', 
     views: { 
      'main': { 
       controller: 'visitsListCtrl', 
       templateUrl: 'App/scripts/visits/views/VisitsList.html', 
       resolve: { 
         name: ['$stateParams', function($stateParams) { 
          return $stateParams.name; 
         }] 
        } 
      } 
     } 
    }); 

Và sau đó trong việc tiếp cận điều khiển tên:

visitsModule.controller('visitsListCtrl', ['name', 
function (name) { 
    console.log(name); 
}]); 

Hy vọng nó sẽ giúp bạn!

+0

Đây là câu trả lời hay với ví dụ rõ ràng, phải là mẫu được chấp nhận. – psp

+0

Chúng ta có thể vượt qua một đối tượng thay vì các kiểu dữ liệu nguyên thủy không? –

+1

Không, bạn có thể sử dụng JSON.stringify nhưng tôi khuyên bạn nên sử dụng một nhà máy để chia sẻ dữ liệu. –

3

Khi bạn nói: $state.go('private.visits', { name : "Object"});

Bạn sẽ không thông qua dữ liệu sang trạng thái private.visits, mà là bạn đang đặt một tham số để các private.visits nhà nước, mà thậm chí không hỗ trợ thông số như bạn chưa xác định các tham số cho nó trong cấu hình trạng thái. Nếu bạn muốn chia sẻ dữ liệu giữa các tiểu bang sử dụng một dịch vụ hoặc nếu các trạng thái của bạn có mối quan hệ cha-con thì trạng thái con sẽ có quyền truy cập vào dữ liệu trạng thái gốc. Thấy như cách bạn không muốn dữ liệu gieo trong URL của bạn, tôi sẽ sử dụng một dịch vụ (getters/setters) để đạt được điều này.

+0

Bạn không nghĩ rằng tham số là dữ liệu? Làm tôi bối rối. – psp

+0

Các tham số bạn chuyển đến một trạng thái thông qua URL là các kiểu nguyên thủy, và được biểu diễn dưới dạng chuỗi, OP muốn truyền một đối tượng, câu trả lời của @Leandro Zubrezki là chính xác nhưng có sự khác biệt, sử dụng các tham số với ui-router cho phép truyền trong các đối tượng (điều này có thể được coi là 'dữ liệu' nhiều hơn tham số tuyến đường). Nhưng vâng, câu trả lời của Leonardo tốt hơn tôi. –

+0

Vì lý do nào đó, ui-router sẽ lọc ra đối tượng tham số đó và chỉ bao gồm đối tượng có tên khớp với tham số đường dẫn cho trạng thái. Vì vậy, vì tên không phải là một tham số đường dẫn, nó đang bị loại bỏ. – DavidA

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