Angular-2 Observable不起作用

时间:2016-07-17 09:11:34

标签: angular observable

以下代码应记录来自输入字段的keyup事件中的数据,但没有任何反应并且控制台保持空白(也没有错误)。

/// <reference path="../typings/tsd.d.ts" />

import {Component} from 'angular2/core';
import {Observable} from "rxjs/Rx";

@Component({
    selector: 'my-app',
    template: `
        <input id="search" type="text" class="form-control">
    `
})
export class AppComponent {
    constructor(){
        var keyups = Observable.fromEvent($("#search"), "keyup");
        keyups.subscribe(data => console.log(data));
    }
}

3 个答案:

答案 0 :(得分:5)

您的代码存在一些问题。

1)。 Observable.fromEvent期望HTML元素作为第一个参数,但是你传递的是jQuery实例。

2)。您正在尝试在构造函数中进行订阅,这不能保证在那时加载组件内容。

3)。您使用硬编码的CSS选择器#search,这是您永远不应该做的。

现在,您可以通过以下方式解决问题:

  1. 将模板引用设置为输入字段。

  2. Observable.fromEvent hook中初始化ngAfterContentInit

  3. @Component({
      selector: 'my-app',
      template: `
        <div>
          <input #search type="text" class="form-control">
        </div>
      `
    })
    export class AppComponent {
    
      @ViewChild('search') input: ElementRef
    
      ngAfterContentInit() {
        var keyups = Observable.fromEvent(this.input.nativeElement, "keyup");
        keyups.subscribe(data => console.log(data));
      }
    }
    

    演示: http://plnkr.co/edit/5TFDv0OoV8wWnDYneiFD?p=preview

答案 1 :(得分:0)

为什么在使用核心angular2 时可以使用 Rxjs 中的可观察

//our root app component
import {Component, Pipe,ViewChild} from '@angular/core';
import {myservice} from 'app/service';

@Component({
  selector: 'my-app',
  template: `
          <h1>angular2</h1>
            <input #box (keyup)="onKey(box.value,$event)">
    <p>{{values}}</p>
  `,
})
export class AppComponent {       
  values = '';

  onKey(value: string,event) {
    this.values += value + ' | ';
    console.log(event);
  }
}

https://plnkr.co/edit/ZSqLNhSi0lI4HdKhulBf?p=preview

官方文件:https://angular.io/docs/ts/latest/guide/user-input.html

答案 2 :(得分:0)

当我使用jquerySelector时,我正在研究一个类似的项目,@ ViewChild函数没有找到该元素。我以声明的方式更改了它:#search并且它有效。

import { AfterViewInit, Component, ViewChild, ElementRef } from '@angular/core';
import { Observable } from 'rxjs/Rx'
@Component({
selector: 'my-app',
template:`
    <input #search type="text" class="form-control"  >
`
})
export class AppComponent {

@ViewChild('search') input: ElementRef

ngAfterContentInit() {
    var keyups = Observable.fromEvent(this.input.nativeElement, "keyup");
    keyups.subscribe(data => console.log(data));
}