2016-05-31 4 views
0

Я пытаюсь создать событие Keyup в угловом2, которое запускается, когда что-то вводится в окне поиска, событие затем регистрируется в консоли. иначе ничего не отображается в консоли. Это мой app.component.ts файлНаблюдаемое событие не работает в Angular2

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

import {Component} from '@angular/core'; 
import {Observable} from 'rxjs/Rx'; 

@Component({ 
selector: 'my-app', 
template: ` 
    <input id="search" type="text" class="form-control"  placeholder="Search"> 

` 
}) 
export class AppComponent { 
constructor(){ 


    var keyups = Observable.fromEvent($("#search"), "keyup"); 


    keyups.subscribe(function(data) { 

     console.log(data); 
    }); 
}} 

И мой файл index.html является

<html> 
<head> 
<title>Angular 2 QuickStart</title> 
<meta charset="UTF-8"> 
<meta name="viewport" content="width=device-width, initial-scale=1"> 
<link rel="stylesheet" href="styles.css"> 
<!-- Latest compiled and minified CSS --> 
<!-- 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 
--> 

<link rel="stylesheet" href="app/bootstrap.min.css"> 
<link rel="stylesheet" href="app/styles.css"> 


<!-- 1. Load libraries --> 
<!-- Polyfill(s) for older browsers --> 
<script src="node_modules/es6-shim/es6-shim.min.js"></script> 
<script src="node_modules/zone.js/dist/zone.js"></script> 
<script src="node_modules/reflect-metadata/Reflect.js"></script> 
<script src="node_modules/systemjs/dist/system.src.js"></script> 

<script src="node_modules/rxjs/bundles/Rx.js"></script> 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
<!-- 2. Configure SystemJS --> 
<script src="systemjs.config.js"></script> 
<script> 
    System.import('app').catch(function(err){ console.error(err); }); 
</script> 
</head> 
<!-- 3. Display the application --> 
<body> 
<my-app>Loading...</my-app> 
</body> 
</html> 

Пожалуйста, может кто-то указать на то, что я здесь отсутствует? Спасибо

ответ

4

Во-первых, вы можете идти о захвате нажатий другим способом:

<input (keyup)="onKeyPress()" id="search" type="text" class="form-control" placeholder="Search">

Это связывает keyup событие запуска, что вы назначаете к этому событию связывания. Затем вы можете добавить функцию onKeyPress в свой компонент с помощью console.log.

https://angular.io/guide/template-syntax#event-binding

Другое дело в том, что конструктор выполняется перед вид инициализации. Так что, если вы настаиваете на связывание с событиями за пределами шаблона, вы можете сделать это:

export class AppComponent implements AfterViewInit

и реализовать ngAfterViewInit функцию в компоненте, где вы можете использовать, что Observable. Обязательно импортируйте AfterViewInit из @angular/core.

https://angular.io/api/core/AfterViewInit

2

Вам необходимо привязать событие к полю ввода и привязать поле ввода к объекту, сделав его угловым способом.

HTML:

<input type="text" (keyup)="someFunction()" [(ngModel)]="model.name" />

, а затем в вашем бэк TS класса:

public model: Object = {}; 

public someFunction() { 
    console.log(model.name); 
} 

Два способа связывания в угловую будет автоматически связывать значение входа в model.name , а событие (keyup) будет прослушивать событие, которое вы хотите.

2

У вас нет доступа к DOM еще в конструкторе, так что вы на самом деле инициализации, что наблюдатель слушать keyup событие на null пункта. Что вам нужно сделать, так это инициализировать этого наблюдателя в кэше жизненного цикла ngAfterViewInit.

ngAfterViewInit(){ 
    var keyups = Observable.fromEvent($("#search"), "keyup"); 

    keyups.subscribe(function(data) { 
     console.log(data); 
    }); 
}