从ngrx store select中获取模型实例

时间:2017-04-03 09:52:14

标签: angular ngrx

从ngrx商店中选择一个对象时,我们不会获得该类的实例,而是具有相同属性的对象。这可以防止调用对象上的函数。

我应该在subscibe函数中创建一个实例吗?我只是想知道我没有找到关于这个主题的任何内容,并想知道什么是最佳做法。

class ItemModel {
  name: string;

  formatedName() {
    return this.name.upperCass(); // always undefined
  }
}

class AnyClass {
  item: ItemModel; 

  construtor() {
    this.store.select(state => state.item).subscribe(item => this.item = item);
  }

  func() {
    this.item.formatedName();
  }
}

1 个答案:

答案 0 :(得分:3)

关于您的代码剪切,至少有一个问题: 您需要使用this作为名称。

formatedName() {
    return >>this.<<name.toUpperCase(); // always undefined
}

(不确定这是否只是在你的剪辑中,或者在你的代码中。

但是:一般不建议在商店中安装类实例,但有一些经验法则:

  1. 商店内容应该可序列化而不需要任何重大修改(=&gt;只使用对象和基元)
  2. ngrx(以及一般的rxjs)在很大程度上依赖于函数式编程模式,因此不建议将其混合使用面向对象的范例。
  3. 由于您没有提供任何进一步的细节,我必须假设您的具体案例是关于格式化字符串(例如大写),我建议您使用模板管道:

    <span>{{item | myFormatToUpperCasePipe}}</span>
    

    我甚至更进一步利用async - Pipe:

    class MyComponent {
        item$ = this.store.select(state => state.item);
    }
    
    // template:
    <span>{{item$ | async | myFormatToUpperCasePipe}}</span>
    

    如果您在模板中不需要此信息,我的问题是:您为什么需要格式化UI中未显示的内容? 但即使在这种情况下,我建议您保留功能模式并使用实用程序方法来转换数据 - 甚至可能作为rxjs-stream的一部分。