2016-07-26 27 views
0

在我的app.component.html中,我创建了一个自定义组件(联系人表组件),该应用程序在我更新商店后应获取新值(帐户)连接的用户成为别人。商店不会触发对异步管道的更改

app.component.html:

<contact-table [contacts]="connectedAccount$ |async"></contact-table> 

app.component.ts:

export class AppComponent implements OnInit 
{ 
    private connectedAccount$: Observable<Account>; 
    constructor(private store:Store<any>) { 
    this.connectedAccount$ = this.store 
     .select(state=> state.connectedAccountReducer.connectedAccount); 

    this.connectedAccount$ 
     .subscribe(account1=> { 
     //the app prints any new account that comes up. It's working here. 
     console.log(account1); 
     }); 
    } 
    public ngOnInit() { 
    this.store.dispatch({ 
     type: updateConnectedAccount, 
     payload: { 
     connectedAccount: ACCOUNTS[0] 
     } 
    }); 
    } 
} 

在AppComponent类的订阅新的伟大工程,并触发只要有任何更新。

问题是app.component.html中的异步管道不会将新帐户发送到联系人表组件。我想他没有得到任何更新通知。

我试着看看发送给联系人表格组件 ,我发现他只在第一次创建联系人表格组件时获得了一个值,并且它未定义。那不是可能的,因为我的reducer函数为我的应用程序的初始状态创建一个空的Account对象。

你有没有注意到我错过了什么?

+0

你的contact-table组件是什么样的? –

回答

0

尝试使用json管道来查看视图是否从该存储区中选择了任何内容。

<span>{{connectedAccount$ |async | json}}</span>

+0

我看到你的其他帖子询问有关选择。我还没有足够的代表在stackoverflow在那里评论。我只是想建议你看看这些例子,如果你没有看到他们帮忙找出设置。 https://github.com/ngrx/example-app和https://github.com/btroncone/ngrx-examples。两人都给了我当前项目的想法。 – wiredprogrammer

2

检查并确保您使用Object.assign创建对您的状态的更改。它不应该返回一个突变的状态。 Redux/ngrx和异步管道检测对象散列变化时的变化(或者至少这是我的理解)。当我没有创建一个全新的对象,但意外地改变现有状态并返回它时,我遇到了这个问题。

引述终极版网站 - >http://redux.js.org/docs/basics/Reducers.html

我们没有发生变异的状态。我们用Object.assign()创建一个副本。 Object.assign(state,{visibilityFilter:action.filter})也是错误的:它会改变第一个参数。您必须提供一个空对象作为第一个参数。您也可以启用对象扩展运算符提议来编写{> ... state,... newState}。

我也有RC2的异步问题,所以如果你不使用RC3或以上,我建议升级。

不是说这是它,但它是我的经验最可能的候选人。希望这可以帮助。

+0

另外,我强烈建议在开发过程中使用ngrx-store-logger。它会在操作前后将状态写出到控制台,并且还会在两者之间打印出操作。 https://github.com/btroncone/ngrx-store-logger – wiredprogrammer

+0

好的,首先感谢您的答案!对于对象中的每个更改,store都会将新状态返回到AppComponent类中的订阅中,如前所述。我不明白为什么这些更改会发送到那里,但不会发送到异步管道。总而言之,我会将你提到的提示+开始使用ngrx-store-logger。欢迎任何其他解决方案。 –

0

可以包括ngrx-store-freeze - 可变状态的问题很容易解决。 我经常调试动作的另一种方式是引入一个用于记录目的的效果。这也有助于识别问题。