2016-03-25 1 views
2

Допустим, у меня есть компонентngModel в пользовательских компонентов работы только одним способом

const DEFAULT_VALUE_ACCESSOR = CONST_EXPR(new Provider(
NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => MyComp), multi: true})); 

@Component({ 
selector: 'my-comp', 
    template: ` 
    <another-one></another-one> 
    `, 
    providers: [DEFAULT_VALUE_ACCESSOR] 

и теперь, когда я использую компонент, как:

@Component({ 
selector: 'app', 
template: `<my-comp [(ngModel)]="someValue"></my-comp> 
     <input [(ngModel)]="someValue" />` 
}) 
class App { 
    someValue: number = 5 
} 

Значение передается в <my-comp> компонента, однако после этого, когда значение изменяется внутри входа, обновляется ngModel, но не <my-comp>. Есть ли что-то еще, что мне нужно настроить?

ответ

2

На самом деле, вам необходимо явно вызвать onChange обратного вызова, который зарегистрирован by Angular2:

@Component({ 
    (...) 
}) 
export class MyComp implements ControlValueAccessor { 
    onChange = (_) => {}; 
    onTouched =() => {}; 

    writeValue(value: any): void { 
    (...) 
    } 

    registerOnChange(fn: (_: any) => void): void { this.onChange = fn; } 
    registerOnTouched(fn:() => void): void { this.onTouched = fn; } 
} 

Например, если вы считаете, что состояние этого настраиваемого компонента изменяется. Вот пример по клику:

@Component({ 
    (...) 
    template: ` 
    <div (click)="updateState()">Update state</div> 
    ` 
}) 
export class MyComp implements ControlValueAccessor { 

    writeValue(value: any): void { 
    this.internalState = value; 
    } 

    updateState() { 
    this.internalState = 'new state'; 
    this.onChange(this.internalState); 
    } 
} 

Эта статья может дать вам больше намеками (смотрите раздел "NgModel-совместимый компонент"):

0

ngOnChanges() вызывается, когда @Input() сек значения изменяются:

@Component({ 
selector: 'my-comp', 
    template: ` 
    <another-one></another-one> 
    ` 
}) 
class MyComp { 
    @Input() someField:number; 

    ngOnChanges(changes) { 
    console.log(changes); 
    } 
} 

и теперь, когда я использую компонент, как:

@Component({ 
selector: 'app', 
template: `<my-comp [someField]="someValue"></my-comp> 
     <input [(ngModel)]="someValue" />` 
}) 
class App { 
    someValue: number = 5 
} 
+0

нормально, но до сих пор, когда ngModel изменен с входа, который уведомит меня в о том, что значение изменено? Я хочу использовать ngModel, а не someField – Bryant11

+0

'[(ngModel)] =" someValue "' изменяет 'someValue' в' App'. Угловое обнаружение изменений передает новое значение 'someField' в' MyComp' из-за '[someField] =" someValue "'. Каждый раз, когда 'someValue' изменяется, Angular updates' someField' и каждый раз, когда 'someField' изменяется на Angular, вызывается' ngOnChanges (...) '. –

Смежные вопросы