当前位置: 首页 > 知识库问答 >
问题:

角英雄教程中2搜索怎么合并?

赵健柏
2023-03-14

使用Angular 2/4英雄之旅教程来说明这种情况,该教程使用一个可观察的按“name”值搜索英雄(https://Angular.io/tutorial/toh-pt6#add-the-ability-to-search-by-name)。hero-search.service.ts中的代码如下:

import { Injectable } from '@angular/core';
import { Http }       from '@angular/http';

import { Observable }     from 'rxjs/Observable';
import 'rxjs/add/operator/map';

import { Hero }           from './hero';

@Injectable()
export class HeroSearchService {

  constructor(private http: Http) {}

  search(term: string): Observable<Hero[]> {
    return this.http
               .get(`api/heroes/?name=${term}`)
               .map(response => response.json().data as Hero[]);
  }
}

我需要做的相当于为Hero类添加第二个“synonym”字符串值:

export class Hero {
  id: number;
  name: string;
  synonym: string;
}

并为每个英雄添加一个同义词:

import { InMemoryDbService } from 'angular-in-memory-web-api';
export class InMemoryDataService implements InMemoryDbService {
  createDb() {
    const heroes = [
      { id: 0,  name: 'Zero', synonym: 'little' },
      { id: 11, name: 'Mr. Nice', synonym: 'pleasant' },
      { id: 12, name: 'Narco', synonym: 'sleep' },
      { id: 13, name: 'Bombasto', synonym: 'loud' },
      { id: 14, name: 'Celeritas', synonym: 'vegetable' },
      { id: 15, name: 'Magneta', synonym: 'color' },
      { id: 16, name: 'RubberMan', synonym: 'hose' },
      { id: 17, name: 'Dynama', synonym: 'motor' },
      { id: 18, name: 'Dr IQ', synonym: 'smart' },
      { id: 19, name: 'Magma', synonym: 'volcanic' },
      { id: 20, name: 'Tornado', synonym: 'wind' }
    ];
    return {heroes};
  }
}
       .get(`api/heroes/?synonym=${term}`)
import { Injectable } from '@angular/core';
import { Http }       from '@angular/http';

import { Observable }     from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/merge';

import { Hero }           from './hero';

@Injectable()
export class HeroSearchService {

  constructor(private http: Http) {}

  search(term: string): Observable<Hero[]> {
    const nameResults = this.http.get(`api/heroes/?name=${term}`);
    const synonymResults = this.http.get(`api/heroes/?synonym=${term}`);    
    nameResults.merge(synonymResults);
    return nameResults.map(response => response.json().data as Hero[]);
  }
}

不能正常工作的代码位于https://plnkr.co/edit/4mrl5reqcsvuzoodixju?p=preview.

我没有看到合并成功的任何证据,nameResults只给出名称,而不给出同义词。不会出现错误消息。

http://reactiveX.io/documentation/operators/merge.html上的RxJS代码使用以下格式的代码

const mergedResults = Rx.Observable.merge(nameResults, synonymResults);

在这里如何使用RxJS合并?

是否有其他使用RxJS的方法更合适?

在Hero类的级别上是否有其他方法可以工作,比如计算namePlusSynonym,而不必向Hero数组中的每一行添加namePlusSynonym?

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/merge';

import { Hero } from './hero';

@Injectable()
export class HeroSearchService {

  constructor(private http: Http) {}

  search(term: string): Observable<Hero[]> {
    const nameResults = this.http.get(`api/heroes/?name=${term}`);
    nameResults.subscribe(nameData => console.log('nameData', nameData));
    const synonymResults = this.http.get(`api/heroes/?synonym=${term}`);
    synonymResults.subscribe(synonymData => console.log('synonymData', synonymData));
    const combinedResults = nameResults.merge(synonymResults);
    combinedResults.subscribe(combinedData => console.log('combinedData', combinedData));
    return combinedResults.map(response => response.json().data as Hero[]);
  }
}
  search(term: string): Observable<Hero[]> {
    const nameResults = this.http.get(`api/heroes/?name=${term}`).map(response => response.json().data as Hero[]);
    nameResults.subscribe(nameData => console.log('nameData', nameData));
    const synonymResults = this.http.get(`api/heroes/?synonym=${term}`).map(response => response.json().data as Hero[]);
    synonymResults.subscribe(synonymData => console.log('synonymData', synonymData));
    const combinedResults = nameResults.merge(synonymResults);
    combinedResults.subscribe(combinedData => console.log('combinedData', combinedData));
    return combinedResults;
  }

共有1个答案

范浩荡
2023-03-14

要使merge运算符工作,您需要从rxjs导入Observable and merge,就像在plunker中一样:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/merge';

在这里如何使用RxJS合并?

我认为您在这里的主要误解是,对一个可观察性调用merge()会返回一个新的合并的可观察性。由于rxjs函数是纯函数,在这里调用它不会改变namedresults

nameResults.merge(synonymResults);
const combinedResults = nameResults.merge(synonymResults);
return combinedResults;

这就是我如何解决这个问题(此处为plunker),使它在不改变现有angular组件的情况下工作,只改变hero-search.service.ts。您可以通过将运算符链接在一起使其看起来更好,但我认为在每个阶段看到有用的变量名和类型对学习非常有帮助。您可以将一个中间的subscribe()&console.log()放在任何可观察的对象上进行测试,以查看值的实际情况。

search(term: string): Observable<Hero[]> {
  // get the response observable from requesting the backend      
  const nameResults: Response = this.http.get(`api/heroes/?name=${term}`);
  // boil that response down to just the data array we care about
  const nameResultsArr: Observable<Hero[]> = nameResults.map(res => res.json().data);
  // do the same for the synonym request
  const synonymResults: Response = this.http.get(`api/heroes/?synonym=${term}`);
  const synonymResultsArr: Observable<Hero[]> = synonymResults.map(res => res.json().data);

  // combine the two observable arrays into a stream of arrays
  const combinedHeroListObservables: Observable<Hero[]> =
    nameResultsArr.merge(synonymResultsArr);
  // concat the observable arrays onto each other
  const concatenatedArrays: Observable<Hero[]> =
    combinedHeroListObservables.reduce((accumulator, current) => accumulator.concat(current));

  // return the combined array
  return concatenatedArrays;
}

但是当我尝试这样的代码时,我得到了一个标记错误:找不到名称'rx'

如果您不关心不必要地导入您不使用的东西,您可以使用这个

import * as Rx from 'rxjs/Rx';
 类似资料:
  • 我有两种型号,App\Song(belongsTo App\Host)和App\Host(有许多App\Song)。 在我的控制器中,我使用以下查询: 这是从mymodel公共函数scopeligable($query) 这不会返回任何结果,请转到

  • 1、自我介绍 2、深挖简历 3、实习经历:之前实习主要的工作内容,你从中学到了什么,它给你带来了什么 4、新媒体运营实习经历:你认为的新媒体运营是什么样子的,你在这份实习中学到了什么 5、了解或使用过英雄社区吗,你认为英雄社区的内容能否吸引你,不能吸引的原因是什么 6、平常使用的游戏社区软件有什么,使用时长,使用频率分别是多少 7、你认为小黑盒和steam的区别,你对于二者的看法 8、确认最早入职

  • 为了开始使用elasticsearch和kibana,我尝试了教程。但现在我得到了一个我自己无法解决的错误。 它对这个非常有趣:elasticsearch bool查询组合必须与或 亲切地问候格雷格

  • 放置英雄(Idle Heroes)是一款用 HTML5 和 Javascript 制作的闲置格斗游戏。你可以杀怪获得声誉值和金钱,声誉值可以解锁新英雄,钱可以升级英雄。 点击试玩

  • 问题 对于 3 times 3 的矩阵 begin{bmatrix} 2 & 8 & 1 3 & 7 & x 6 & 4 & 5 end{bmatrix} x 点可以与上下左右的相邻点交换位置,除此之外不能随意改变位置,将该矩阵变成 begin{bmatrix} 1 & 2 & 3 4 & 5 & 6 7 & 8 & x end{bmatrix} 求最少变换次数以及变化经过,若将矩阵的初始状态看作

  • 方式一: 在地图主界面点击定位,会弹出周边搜索的提示(中心点是现在当前位置) 方式二: 选中一个网点数据,底部按钮有一个“搜附近按钮”,点击即可进行周边搜索(中心点是你选中的网点数据)