2016-10-28 24 views
5

Tôi đang cố gắng viết dịch vụ DataResolver cho phép bộ định tuyến Angular 2 tải trước dữ liệu trước khi khởi tạo thành phần của tôi.Góc 2: chuyển giá trị cho dữ liệu tuyến đường giải quyết

Trình phân giải cần gọi các điểm cuối API khác nhau để tìm nạp dữ liệu phù hợp với tuyến đang được tải. Thay vì có trình phân giải cho từng thành phần của tôi, tôi đang xây dựng một trình phân giải chung. Vì vậy, tôi muốn chuyển đầu vào tùy chỉnh trong định nghĩa tuyến đường trỏ tới điểm cuối chính xác. Ví dụ, hãy xem xét các đường bay:

app.routes.ts

appRoutes = [ 
    { 
    path: 'project/:id', 
    component: ProjectComponent, 
    resolve: { data: DataResolver } 
    }, 
    { 
    path: 'store/:id', 
    component: StoreComponent, 
    resolve: { data: DataResolver } 
    } 
] 

Trong trường hợp đầu tiên, resolver sẽ cần phải gọi /path/to/resource1/id. Trong trường hợp thứ hai, /path/to/resource2/id. Lý tưởng nhất, tôi sẽ vượt qua điểm cuối làm đối số trong định nghĩa tuyến đường mà sau đó sẽ có sẵn trong hàm tạo DataResolver.

Điều này có thể được thực hiện với lớp phân giải chung không?

Angular 2.0.1 viết bằng Typescript 2.0.3

Trả lời

10

Tôi không biết về làm cho nó có sẵn trong các nhà xây dựng, mà không sử dụng DI. Nhưng nếu bạn muốn nó có sẵn trong phương pháp resolve, bạn chỉ có thể thêm một tài sản data trong định nghĩa đường, và điều này sẽ làm cho nó có sẵn cho các ActivatedRouteSnapshot

{ 
    path: 'project/:id', 
    component: ProjectComponent, 
    resolve: { data: DataResolver }, 
    data: { path: 'project/:id' } 
} 

class DataResolve implements Resolve<string> { 
    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    return route.data['path']; 
    } 
} 
+0

trong dòng cuối cùng - 'route.data ['path']', sẽ ': id' được tự động thay thế bằng tham số tuyến hiện tại hay nó sẽ là chuỗi ký tự 'project /: id'? – BeetleJuice

+1

Không. Tôi đoán tôi đã hiểu nhầm câu hỏi của bạn. Tôi mặc dù đó là những gì bạn muốn. Chỉ cần lấy 'url' từ' route'. Nó sẽ là một 'UrlSegment []'. 'url [1] .path' phải có id và' url [0] .path' phải là 'project' –

+0

Tôi có thể đã thực hiện một công việc tốt hơn để giải thích. 'resolve()' sẽ gọi API và trả về Observable sẽ phát ra dữ liệu được trả về bởi máy chủ. Thách thức của tôi là điểm cuối API để gọi phụ thuộc vào thành phần có dữ liệu được giải quyết. Câu trả lời của bạn là hữu ích mặc dù. Tôi có thể sử dụng thuộc tính 'data' của route để tạo các đầu vào tùy chỉnh có sẵn cho' resolve() '. Cảm ơn. – BeetleJuice

0

Câu trả lời này giải quyết vấn đề của tôi, nhưng tôi cũng cần thiết này được áp dụng trong trường hợp tuyến đường có nhiều trình phân giải.

ví dụ:

{ 
    path: 'transactions/showcase/edit/:id', 
    component: ClientsTransactionsFormComponent, 
    resolve: { 
     clients: Resolver, 
     clientTransaction: Resolver, 
     clientTransactionTypes: Resolver 
    }, 

Trong trường hợp đó, tôi đã giải quyết được vấn đề của mình bằng cách truyền mảng dữ liệu.

data: ['Clients/GetAll', 'ClientTransactions/GetByID/', 'ClientTransactionTypes/GetAll'] 

và cũng biến đổi phân giải của tôi như thế này ..

resolve(route: ActivatedRouteSnapshot) { 
    let row = []; 
    let id = ""; 

    Object.keys(route.data).forEach(e => { 
     row.push(route.data[e]); 
    }) 

    let path: string = row[0]; 
    delete row[0]; 

    route.data = row; 

    if (path.lastIndexOf('/') == path.length - 1) { 
     id = route.params['id']; 
    } 

    return this._httpService.httpGet(this.baseUrl + path + id); 
    } 

hy vọng nó sẽ giúp bất cứ ai.

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