2016-07-27 49 views
3

我正在开发一个Angular 2.0和NGRX的应用程序。我来自React/Redux,所以我仍然在想办法做些什么。如何用NGRX改变状态后执行一些代码?

当我要打印模板里面的东西我能写这样的事:

@Component({ 
    selector: 'dashboard', 
    directives: [MainContainer], 
    styleUrls: [ 
    './dashboard.style.css' 
    ], 
    template: ` 
    <main-container [section]="viewSection | async"></main-container> 
    ` 
}) 
export class Dashboard { 

    private viewSection: Observable<MainViewSection>; 

    constructor(
    private store: Store<AppState> 
) { 
    this.viewSection = this.store.let(getMainViewSection()); 
    } 

} 

但现在我想一个值发生变化后执行一些代码(它会使用店内的值作为输入(即将改变后视图)

我知道我可以在阵营componentWillReceiveProps

我发现的唯一的事情,可以是有用的是这样的:

export class View { 

    constructor(
    private store: Store<AppState> 
) { 
    this.store.select('data').subscribe((val: DataState) => { 
     if (!layer) { 
     return; 
     } 
     layer.setData(val); 
    }); 
    } 

} 

我不认为这是一种优雅的方式,但我无法找到另一种方式..人们告诉我使用服务(我不知道这是如何适合这种情况),我读过约@Effects,但我不知道这是我在找什么。

谢谢!

回答

2

我认为@Effect是你正在寻找什么。当某个状态动作被调用时,@Effect执行。就拿从官方的这个例子NGRX example app

@Effect() clearSearch$ = this.updates$ 
    .whenAction(BookActions.SEARCH) 
    .map<string>(toPayload) 
    .filter(query => query === '') 
    .mapTo(this.bookActions.searchComplete([])); 

使用您指定动作触发该效果的whenAction方法。在这个例子中,他们使用toPayload,它只返回执行动作的有效载荷。但是你可以访问整个应用程序的状态。

这是你如何使用它,例如:

.whenAction(YourActions.SOMETHING) 
    .switchMap(data => this._xhr.send(data.state.yourData) 
+0

我想过这个问题,但我怎么能触发对象的方法,一个组件内的? 我有一个地图图层,我必须更改一些参数并调用方法。我应该将图层存储在状态中并通过效果改变它吗? –

+0

是的,我认为是。如果你想在状态改变时调用组件中的方法,那么它不应该是一个组件方法,而应该是一个状态动作。 –