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>

ディレクティブ内がAngularCLIで生成されたコードのみである場合でも:

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

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

 constructor() { }

 }

エラーが発生しました:

zone.js:388未処理のPromise拒否:テンプレート解析エラー:「p」の既知のプロパティではないため、「appContenteditableModel」にバインドできません。

この角度のあるドキュメントに従って、ほぼすべての可能な変更を試しましたが、すべてが機能するはずですが、機能しません。

何か助けはありますか?


結果Iの必要性である[(appContenteditableModel)]="draftMessage.text"...最後に
トマスJavurek

次に、このように試してください<p [appContenteditableModel]="draftMessage.text"></p>
Sanket 2016年

角かっこなしで機能し、promiseの拒否appContenteditableModel="draftMessage.text"(appContenteditableMode)l="draftMessage.text"解決しますが、変数を渡さないようです
Tomas Javurek 2016年

回答:


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 2016年

@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]
})

そして、それらが同じモジュールにない場合はどうなりますか?
オハドサダン

@OhadSadanあなたが何を意味するのか正確にはわかりません。これは、同じモジュールにそれらがない場合の例です。共有モジュールでそれらを作成する場合は、必ずANDエクスポートディレクティブを宣言してください(次に、それらをにインポートする必要があります)。別のモジュール)。
Simon_Weaver

'main'モジュールでは、 'directivesモジュール'をインポートするだけで、すべてのコンポーネントがそれらを見ることができます。
Simon_Weaver

これは細部ですが、見落とされがちです。ありがとうございました !
サミ

2

私にとってこの修正は、ルートからの指示参照動いていたapp.module.ts(ラインのためimportdeclarationsおよび/またはexports複数の特定のモジュールに)src/subapp/subapp.module.ts私のコンポーネントはに属しています。


1

要するに、あなたの指令は アンカーディレクティブの、角かっこを削除すると機能します。

実際、ブラケットを削除する必要があるかどうかに関連する対応するセクションは見つかりませんでした。動的コンポーネントのセクションに記載されているのは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.