【问题标题】:Angular2 Accessing first element in Observable of arrayAngular2访问数组的Observable中的第一个元素
【发布时间】:2016-12-01 19:41:43
【问题描述】:

编辑:我终于在https://plnkr.co/edit/A2WipJwW9kEhhlh90xMj 解决了我的问题。如果您点击选择市场然后按回车,它将在 market-search.component.ts 文件中输入marketSelectorDropDown 方法。问题出在地图下方的几行中,并且在再次单击选择市场下拉菜单之前,永远不会执行订阅。我不懂为什么。任何帮助是极大的赞赏!

this.markets
        .map(markets => {
            debugger
            if(markets && markets.length > 0) return markets[0];
        })
        .subscribe((market: Market) => {
            debugger
            this.pick(market.name)
        });

编辑:在标记为答案的 cmets 中就是答案。它是使用一个 BehaviorSubject。这允许迟到的订阅者获得最后发送的事件。

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    我能够通过使用 Angular 的异步管道访问 Observable 的第一个成员。

    你的组件.html (yourObservable | async | slice :0:1)

    【讨论】:

      【解决方案2】:

      根据 RxJS5 文档

      第一个运算符

      如果不带参数调用,首先发出源的第一个值 可观察,然后完成。如果使用谓词函数调用,首先 发出与指定匹配的源的第一个值 健康)状况。它也可能需要一个 resultSelector 函数来产生 输入值的输出值,以及一个 defaultValue 以防万一 源在能够发出有效值之前完成。投掷 如果未提供 defaultValue 且匹配元素为 没找到。

      如果你从事件中处理 Observable 会很有用

      例如,仅发出在 DOM 上发生的第一次点击(如 jQuery 中的 .one

      var clicks = Rx.Observable.fromEvent(document, 'click');
      var result = clicks.first();
      result.subscribe(x => console.log(x));
      

      或者您可以查看此答案中的其他用例Angular 2 runOutsideAngular still change the UI

      所以它不是你想要的,但你可以这样使用它:

      .first(null, arr => arr[0]).subscribe...
      

      它应该返回数组的第一个元素Plunker Example(first)

      但我会利用 map 运算符来做同样的事情:

      .map(arr => arr[0]).subscribe...
      

      Plunker Example(地图)

      【讨论】:

      • 当我尝试:` this.markets .first(null,markets =>markets[0]) .subscribe((market: Market) => { this.pick(market.name) }) ; ` 并在 subscribe 方法中设置一个断点,它永远不会被命中。
      • Angular2 使用 rxjs5。我添加了 plunker。有虚拟 json,它总是返回 name1
      • 我非常感谢您的示例,并且我看到了它现在是如何工作的,但是当我将您的代码应用于我的代码时,它就不起作用了。我不明白为什么。你有什么想法吗?这次我在我的问题中包含了整个 ts 文件。
      • 我在 plunk 中遇到了问题
      • Observables 是惰性的。在发出事件之前尝试订阅plnkr.co/edit/4Oo5WZzjL6b7O8SV6IFj?p=preview
      【解决方案3】:

      您的示例不起作用,因为您使用 RxJS 2 的 CDN,为此您需要 RxJS 5。 我尝试将 CDN 替换为版本 5,它工作得很好。

      【讨论】:

      • 感谢您的帮助。我没有意识到我在示例中使用了错误的版本,但我仍然无法让它在我的现实世界中工作。
      • 在您的标记中,尝试使用:(keydown.enter),不要使用大写字母。
      • 事件的大小写不是问题。事件在此plunk 中触发。问题是我在地图上方重申并且订阅永远不会触发,直到将新的 searchTerm 添加到主题中。
      猜你喜欢
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2020-09-06
      • 1970-01-01
      相关资源
      最近更新 更多