在Angular 2

时间:2017-03-30 16:55:42

标签: angular observable angular2-services angular2-observables

我已经搜索了很长时间才能了解如何订阅其值不断更新的数组。

我需要了解如何正确设置我的Angular 2+服务可观察并正确地在我的组件中订阅它。请假设代码的所有其他部分都能正常工作。

@Injectable()
export class AutocompleteService {

    searchTerm: string;
    results = [];
    observe$ = Observable.from(this.results);

    searchTest(term){
        this.searchTerm = term.toLowerCase();

        if(this.searchTerm.length > 2){
            this.recruiters.forEach(function(el){
                if(el.name.toLowerCase().indexOf(term) != -1) {
                    this.results.push(el);
                }   
            });    

        }
    }

    getCurrentResults():Observable<Object> {
        return this.observe$;
    }

服务中的所有内容都按预期工作。如果我记录term我从组件中获取用户输入。或者将匹配搜索结果后的results数组推送到它上面。

@Component({
    selector: 'autocomplete',
    templateUrl: './autocomplete.component.html',
    providers: [AutocompleteService]
})
export class AutocompleteComponent implements OnInit{
    constructor(private autocompleteService: AutocompleteService){}

    value: string = '';
    searchControl = new FormControl();

    // fired when input happens
    getResults(event){
        this.autocompleteService.searchTest(event.target.value);

        this.autocompleteService.getCurrentResults().subscribe(
            value => console.log(value)
        );

    }

我尽可能地设置了可观察的模式,但我没有从getResults中的.subscribe中获取任何内容

2 个答案:

答案 0 :(得分:4)

您的代码中存在许多错误

  1. 您的服务中没有this.recruiters字段

  2. this.results.push(el);不会将任何内容推送到结果,因为您使用forEach(function(el){它应该是forEach((el)=>,以便范围内的this引用为您服务。

  3. 示例plunker:http://plnkr.co/edit/5L0dE7ZNgpJSK4AbK0oM?p=preview

答案 1 :(得分:3)

除了jonrsharpeechonax所说的内容之外,还有其他内容:

你可以使用主题:

@Injectable()
export class AutocompleteService {

    searchTerm: string;
    results = [];
    subject = new Subject();

    searchTest(term){
        this.searchTerm = term.toLowerCase();

        if(this.searchTerm.length > 2){
            this.recruiters.forEach(el =>{
                if(el.name.toLowerCase().indexOf(term) != -1) {
                    this.subject.next(el);
                }   
            });    

        }
    }

    getCurrentResults():Subject<Object> {
        return this.subject;
    }

}

并以与您相同的方式订阅getCurrentResults()

你演示:plunker