Angular2는 요소의 알려진 속성이 아니기 때문에 DIRECTIVE에 바인딩 할 수 없습니다.


91

Angular CLI에서 새 @Directive를 생성하여 내 app.module.ts로 가져 왔습니다.

import { ContenteditableModelDirective } from './directives/contenteditable-model.directive';

import { ChatWindowComponent } from './chat-window/chat-window.component';

@NgModule({
  declarations: [
    AppComponent,
    ContenteditableModelDirective,
    ChatWindowComponent,
    ...
  ],
  imports: [
    ...
  ],
  ...
})

내 구성 요소 (ChatWindowComponent)에서 사용하려고합니다.

<p [appContenteditableModel] >
    Write message
</p>

지시문 내에 Angular CLI 생성 코드 만있는 경우에도 :

 import { Directive } from '@angular/core';

 @Directive({
   selector: '[appContenteditableModel]'
 })
 export class ContenteditableModelDirective {

 constructor() { }

 }

오류가 발생했습니다.

zone.js : 388 처리되지 않은 약속 거부 : 템플릿 구문 분석 오류 : 'p'의 알려진 속성이 아니므로 'appContenteditableModel'에 바인딩 할 수 없습니다.

각도 문서에 따라 모든 가능한 변경 사항을 시도했지만 모든 것이 작동하지만 그렇지 않습니다.

도움이 필요하세요?


내가 필요한 결과 [(appContenteditableModel)]="draftMessage.text"는 끝에 있습니다 ...
Tomas Javurek 2016

그런 다음 이렇게 해보십시오<p [appContenteditableModel]="draftMessage.text"></p>
Sanket

그것은 괄호없이 작동 appContenteditableModel="draftMessage.text"하고 또한 (appContenteditableMode)l="draftMessage.text"약속의 거부를 해결뿐만 아니라 변수 통과하지 못한 것 같다
토마스 Javurek

답변:


146

속성을 괄호 []로 묶을 때 바인딩하려고합니다. 그래서 당신은 그것을 @Input.

import { Directive, Input } from '@angular/core';

@Directive({
 selector: '[appContenteditableModel]'
})
export class ContenteditableModelDirective {

  @Input()
  appContenteditableModel: string;

  constructor() { }

}

중요한 부분은 멤버 ( appContenteditableModel)가 DOM 노드 (이 경우 지시문 선택기)의 속성으로 이름이 지정되어야한다는 것입니다.


내 지시문에 입력 @Input ('appContenteditableModel') model : any;과 출력 @Output ('appContenteditableModel') update : EventEmitter<any> = new EventEmitter();이 있습니다. 모델이 잘 작동하는 것 같지만에서 호출 한 이미 터는 this.update.emit(value)상위 구성 요소의 값을 변경하지 않습니다. 내가 뭘 잘못 했어? [(appContenteditableModel)]="draftMessage.text"
Tomas Javurek 2016

실제로 나는 <input> 요소 외부에서 "시뮬레이션"[(ngModel)]을 시도합니다
Tomas Javurek

@Output이벤트 생성 전용입니다. 값을 부모 값과 동기화하려면 @HostBinding주석 추가를 고려할 수 있습니다 .
naeramarth7 2016

내가 잘 이해 @HostBinding하면 html 요소 내에서 값을 동기화하는 데 도움이 될 것입니다. 맞습니까? 이 요소 contenteditable="true"는 동일한 구성 요소의 변수와 동기화를 유지해야하는 입력을 위해 사용자가 편집 해야합니다.
Tomas Javurek 2016

35

공유 모듈을 사용하여 지시문을 정의하는 경우 정의 된 모듈에 의해 선언되고 내보내 졌는지 확인하십시오.

// this is the SHARED module, where you're defining directives to use elsewhere
@NgModule({
  imports: [
    CommonModule
  ],
  declarations: [NgIfEmptyDirective, SmartImageDirective],
  exports: [NgIfEmptyDirective, SmartImageDirective]
})

동일한 모듈에 있지 않으면 어떻게됩니까?
Ohad Sadan 19

@OhadSadan 정확히 무슨 뜻인지 잘 모르겠습니다. 이것은 같은 모듈에 그것들 이없는 경우의 예이며 , 공유 모듈에서 생성하는 경우 지시문 및 내보내기 지시문을 선언해야합니다 (그런 다음이를 다른 모듈).
Simon_Weaver

'메인'모듈에서 '지시문 모듈'만 가져 오면 모든 구성 요소에서 볼 수 있습니다.
Simon_Weaver

이것은 사소한 세부 사항이지만 종종 누락됩니다. 감사합니다 !
Sami

2

나를 위해 수정이 루트에서 지침 참조 움직이고 있었다 app.module.ts(라인에 대한 import, declarations및 / 또는 exports보다 구체적인 모듈) src/subapp/subapp.module.ts내 구성 요소가 소유합니다.


1

요컨대, 지시문이 앵커 지시문 처럼 보이기 때문에 대괄호를 제거하면 작동합니다.

실제로 괄호를 제거해야하는시기와 관련된 해당 섹션을 찾지 못했습니다. 동적 구성 요소 에 대한 섹션에 내가 찾은 멘션이 하나뿐입니다 .

대괄호없이 적용<ng-template>

그러나 이는 속성 지시문 문서 에서 완벽하게 다루지 않습니다 .

개별적으로, 나는 당신과 함께 동의하고 그 생각 [appContenteditableModel]에 동일해야 appContenteditableModel각 템플릿 파서가 있는지를 해결할 수 있으며 @input()뿐만 아니라, 자동으로 데이터 바인딩 여부. 그러나 현재 Angular 버전 7에서도 후드에서 똑같이 처리되지 않은 것 같습니다.


1

공유 모듈에서 선언 된 지시문과 동일한 문제에 직면했습니다. 이 지시문을 사용하여 양식 컨트롤을 비활성화합니다.

import { Directive, Input } from '@angular/core';
import { NgControl } from '@angular/forms';

@Directive({
  selector: '[appDisableControl]'
})
export class DisableControlDirective {

  constructor(private ngControl: NgControl) { }

  @Input('disableControl') set disableControl( condition: boolean) {
    const action = condition ? 'disable' : 'enable';
    this.ngControl.control[action]();
  }

}

제대로 작동하려면 공유 모듈 (또는 사용중인 모듈)에서 지시문을 선언하고 내보내십시오.

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DisableControlDirective } from './directives/disable-control/disable-control.directive';

@NgModule({
  declarations: [
    DisableControlDirective
  ],
  imports: [
    CommonModule
  ],
  exports: [DisableControlDirective],
  providers: [],
  bootstrap: []
})
export class SharedModule { }

이제 SharedModule을 가져 오는 모든 모듈에서이 지시문을 사용할 수 있습니다 .

이제 반응 형의 컨트롤을 비활성화하려면 다음과 같이 사용할 수 있습니다.

<input type="text" class="form-control" name="userName" formControlName="userName" appDisableControl [disableControl]="disable" />

실수로 선택기 (appDisableControl) 만 사용하고 비활성화 매개 변수를 이것에 전달했습니다. 그러나 입력 매개 변수를 전달하려면 위와 같이 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.