使用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;
}
要使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} 求最少变换次数以及变化经过,若将矩阵的初始状态看作
方式一: 在地图主界面点击定位,会弹出周边搜索的提示(中心点是现在当前位置) 方式二: 选中一个网点数据,底部按钮有一个“搜附近按钮”,点击即可进行周边搜索(中心点是你选中的网点数据)