of-select 未在 Angular 2 中更新
ng-select not updating in Angular 2
你好,我是 angular 2
的新人
我可以在 ng-select 控件中添加 formGroup 并预定义添加的值。
太好了。
但是当单击按钮时,新值将推入 ng-select 但 ng-select 不会更新 .
这是我的笨蛋
https://plnkr.co/edit/Hwfk1T2stkiRcLTxuFmz
//our root app component
import {Component, OnInit, NgModule, ViewChild} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';
import {SelectModule} from 'ng-select';
@Component({
selector: 'my-app',
template: `
<h1>ng-select demo app</h1>
<form style="padding:18px;max-width:800px;"
[formGroup]="form">
<div style="margin:5px 0;font-weight:600;">Single select example</div>
<ng-select
[options]="options0"
[multiple]="false"
placeholder="Select one"
formControlName="selectSingle"
>
</ng-select>
<button (click)="pushValue()">Click</button>
<div>Events:</div>
<pre #preSingle>{{logSingleString}}</pre>
</form>`
})
export class App implements OnInit {
form: FormGroup;
multiple0: boolean = false;
options0: any[] = [];
selection: Array<string>;
@ViewChild('preSingle') preSingle;
logSingleString: string = '';
constructor() {
this.options0.push({"label":'test',"value":'Test'});
console.log("Object:::"+JSON.stringify(this.options0));
}
ngOnInit() {
this.form = new FormGroup({});
this.form.addControl('selectSingle', new FormControl(''));
console.log("Object:::"+JSON.stringify(this.options0));
}
pushValue()
{
console.log("pushValue call.");
this.options0.push({"label":"test","value":"Test"});
console.log("Object:::"+JSON.stringify(this.options0));
}
}
@NgModule({
imports: [
BrowserModule,
ReactiveFormsModule,
SelectModule
],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
哪里错了???
查看 ng-select
源代码我注意到了
ngOnChanges(changes: any) {
if (changes.hasOwnProperty('options')) {
this.updateOptionsList(changes['options'].isFirstChange());
}
因此,为了更新选项列表,您应该触发 ngOnChanges
。可以通过创建对 options0
的新引用来完成
this.options0 = this.options0.concat({"label":"test","value":"Test"});
或
this.options0 = [...this.options0, {"label":"test","value":"Test"}];
你可以使用Array.slice()
更新数组实例,让angular检测到数组的变化。
this.options0 = this.options0.slice();
变更检测
Ng-select 组件实现了 OnPush
变化检测,这意味着脏检查检查不可变数据类型。这意味着如果您进行对象突变,例如:
this.items.push({id: 1, name: 'New item'})
组件将不会检测到更改。相反,您需要这样做:
this.items = [...this.items, {id: 1, name: 'New item'}];
这将使组件检测到更改和更新。有些人可能担心这是一个昂贵的操作,但是,它比 运行 ngDoCheck
和不断区分数组的性能要好得多。
你好,我是 angular 2
的新人我可以在 ng-select 控件中添加 formGroup 并预定义添加的值。
太好了。 但是当单击按钮时,新值将推入 ng-select 但 ng-select 不会更新 .
这是我的笨蛋
https://plnkr.co/edit/Hwfk1T2stkiRcLTxuFmz
//our root app component
import {Component, OnInit, NgModule, ViewChild} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {FormControl, FormGroup, ReactiveFormsModule} from '@angular/forms';
import {SelectModule} from 'ng-select';
@Component({
selector: 'my-app',
template: `
<h1>ng-select demo app</h1>
<form style="padding:18px;max-width:800px;"
[formGroup]="form">
<div style="margin:5px 0;font-weight:600;">Single select example</div>
<ng-select
[options]="options0"
[multiple]="false"
placeholder="Select one"
formControlName="selectSingle"
>
</ng-select>
<button (click)="pushValue()">Click</button>
<div>Events:</div>
<pre #preSingle>{{logSingleString}}</pre>
</form>`
})
export class App implements OnInit {
form: FormGroup;
multiple0: boolean = false;
options0: any[] = [];
selection: Array<string>;
@ViewChild('preSingle') preSingle;
logSingleString: string = '';
constructor() {
this.options0.push({"label":'test',"value":'Test'});
console.log("Object:::"+JSON.stringify(this.options0));
}
ngOnInit() {
this.form = new FormGroup({});
this.form.addControl('selectSingle', new FormControl(''));
console.log("Object:::"+JSON.stringify(this.options0));
}
pushValue()
{
console.log("pushValue call.");
this.options0.push({"label":"test","value":"Test"});
console.log("Object:::"+JSON.stringify(this.options0));
}
}
@NgModule({
imports: [
BrowserModule,
ReactiveFormsModule,
SelectModule
],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
哪里错了???
查看 ng-select
源代码我注意到了
ngOnChanges(changes: any) {
if (changes.hasOwnProperty('options')) {
this.updateOptionsList(changes['options'].isFirstChange());
}
因此,为了更新选项列表,您应该触发 ngOnChanges
。可以通过创建对 options0
this.options0 = this.options0.concat({"label":"test","value":"Test"});
或
this.options0 = [...this.options0, {"label":"test","value":"Test"}];
你可以使用Array.slice()
更新数组实例,让angular检测到数组的变化。
this.options0 = this.options0.slice();
变更检测
Ng-select 组件实现了 OnPush
变化检测,这意味着脏检查检查不可变数据类型。这意味着如果您进行对象突变,例如:
this.items.push({id: 1, name: 'New item'})
组件将不会检测到更改。相反,您需要这样做:
this.items = [...this.items, {id: 1, name: 'New item'}];
这将使组件检测到更改和更新。有些人可能担心这是一个昂贵的操作,但是,它比 运行 ngDoCheck
和不断区分数组的性能要好得多。