1

ユーザーが入力に文字を入力するときにngOnChangesを使用して検索フィルタを作成しようとしています。ここに私のコードは次のとおりです。@Input Decoratorを使用してngOnChangesライフサイクルフックを角度2でトリガーする

export class SearchComponent implements OnInit, OnChanges { 
     @Input() search:string 

     // trying to get this to run each time the input value changes 
     public ngOnChanges(changes: any) { 
      console.log(changes.search); 
     } 
} 

@NgModule({ 
     imports: [MaterialModule, FlexLayoutModule, BrowserModule, FormsModule] 
     // declarations, providers, exports also defined here 
}) 

コンポーネントテンプレート内の入力要素:

// using Material Design Library 
<input mdInput [search]="searchText" type="text" placeholder="Search"></input> 

または私はこれだけのよう@Inputを使用することができます。

<search-component [search]="searchText"></searchComponent> 

しかし、その後、検索テキストがバインドここではありません私のコントローラーに?

私は入れませんエラーが入力 『『それはの既知のプロパティではありませんので、』検索「にバインドできません』 です。

私は@Inputデコレータは、の世話をしたことを理解していましたそれが、明らかに私はここで何かが足りないのです

注:私は(ngModelChange)を使用してフィルタを追加しましたし、細かい私のcontroller..worksで[(ngModel)]の値に結合する。しかし、それはngOnChangesを使用してのように聞こえます。私はそれを動作させる方法を理解しようとしているので、これを行うための最良の方法です。ありがとう

答えて

0

私はわからないが、私は理解したよう私は私のコードでは似たような

@Directive({ 
    selector: '[contenteditableModel]', 
    host: { 
    '(blur)': 'onEdit()', 
    '(keyup)': 'onEdit()' 
    } 

}) 

export class ContentEditableDirective implements OnChanges { 
@Input('contenteditableModel') model:any; 
@Output('contenteditableModelChange') update = new EventEmitter(); 

constructor(private elementRef:ElementRef) { 

} 


ngOnChanges(changes:SimpleChanges):void { 

    if (changes.model.firstChange == true) { 
     this.refreshView(); 
    } 

} 

public onEdit() { 

    let value:string = this.elementRef.nativeElement.innerHTML; 
    this.update.emit(value); 

} 

public refreshView():void { 

    this.elementRef.nativeElement.innerHTML = this.model; 
} 

}

を持って、私は実際に私がからkeyupに私のonEditを結合し、代わりにそれを、ngOnChanges機能を使用しておりませんとEventEmmiterによるトリガ変更イベント()

私は私のコードは、あなたが解決

1

@Input()は、あなたが目に式をバインドすることができます見つけるのに役立つことを願っていますそのプロパティでバインドされたプロパティを使用することができます。searchを入力プロパティとして宣言すると、プロパティでバインディングを使用できます。したがって、これを使用するには、SearchComponentを配置するコンポーネントのテンプレートでこれを行うだけです(例:

<app-root> 
    <search-component [search]='"dummy text"'></searchComponent> 
</app-root> 

HTMLInputElementインタフェースはそのようなメンバーを持っていないので、あなたはそれ故に例外、input要素にsearch財産上の結合性を行うことはできません。バインディングする特定の要素に存在するプロパティに対してのみプロパティバインディングを実行できます

+0

OKは入力要素のプロパティに意味があります。したがって、これをコンポーネント要素に追加すると、用のテンプレート内の入力要素が自動的に検索され、ngOnChangesによって変更が取得されます。私はまだ何かが欠けているので、それは更新ではありません。または、テンプレートの入力要素の変更をどのように取得するのですか?そして、ユーザーが入力すると、入力上のテキスト値にどのようにバインドできますか。どのように私のコントローラ内のダミーのテキストにバインドする2つの方法 - [(検索)] = 'dummyText'、コントローラ: "this.dummyText" ..正しいですか?ありがとう – bschmitty

+0

のテンプレートには、サービスから来たデータのリストがあり、* ngForを使ってそれをページに表示するようになっています。それだけでなく入力要素もあります。ユーザーがフィルターをかけることができるテンプレート。これが、テンプレートの特定の入力要素でどのように変更が正確にどのように取り上げられるのだろうと思っている理由です... – bschmitty

+1

2方向データバインディングを 'SearchComponent'テンプレートに入れたいのであれば、これを行います。 'であるので、ユーザが何らかのテキストを入力すると、' input.value'が変更され、 'search'プロパティが更新され、' search'プロパティが変更された場合、テキスト入力ボックスは新しい値を表示します。あなたのためのデータフロー。角度フォームを使用するには、各要素に 'name'属性を設定する必要があることに注意してください。 – Dummy

関連する問題