源代碼:
getNextPageContext(): Observable<PageContext> {
const a = this.store.pipe(select(RoutingSelector.getNextPageContext));
console.log('Jerry next page context: ' + a);
a.subscribe((b) =>{
console.log(b);
});
return a;
}
單步調試:
a是調用類似ABAP open SQL從ngrx store裡select出來的一個store 引用:
把store對象的operator字段取出來,存放到變量operator裡。
等價于:const operator = this.operator;
上圖第21行的變量ObserverOrNext, 即我們指定到subscribe調用裡的回調函數。
在toSubscriber.js檔案裡,把我們傳入到subscribe裡的回調函數,封裝成一個Subscriber執行個體。
Subscriber的destination字段,存儲的是SafeSubscriber執行個體,指向我們指定的回調函數。
_next存放的就是回調函數:
operator:
this和this.source的類型都是Store.
下面這行代碼相當于告訴this.store, 讓其通知subscriber了:
DistinctUntilChangedSubscriber這個subscriber,就是普通的subscriber基礎上,包裹一層DistinctUntilChanged:
現在又要為DistinctUntilChangedSubscriber建立一個subscriber了:
這裡終于調用store的_subscribe方法了:
在ReplaySubject.js裡,手動調用subscriber的next方法:
而next的輸入參數,這個_events數組裡有全局的action資料:
@ngrx/store/update-reducers裡能看到所有的features:
這裡能看出,輸入是上面介紹的一大串複雜的state和action結構,輸出就是homepage和content page的Pagecontext了。
而上圖29行的this.project, 應該是我們應用程式傳入的一個函數。
864行,一會再設定斷點:
執行到53行時,再切換到ngrx-store.js裡,設定斷點:
注意斷點的位置需設定準确:
沒有成功,再試試map.js的第29行:
cmsRequired
這裡是RouterState的初始狀态:
page.effect.ts: