Ich habe neues @Directive von Angular CLI generiert und es wurde in meine app.module.ts importiert
import { ContenteditableModelDirective } from './directives/contenteditable-model.directive';
import { ChatWindowComponent } from './chat-window/chat-window.component';
@NgModule({
declarations: [
AppComponent,
ContenteditableModelDirective,
ChatWindowComponent,
...
],
imports: [
...
],
...
})
und ich versuche, in meiner Komponente (ChatWindowComponent) zu verwenden
<p [appContenteditableModel] >
Write message
</p>
Auch wenn innerhalb der Direktive nur Angular CLI-Code generiert wird:
import { Directive } from '@angular/core';
@Directive({
selector: '[appContenteditableModel]'
})
export class ContenteditableModelDirective {
constructor() { }
}
Ich habe den Fehler bekommen:
zone.js: 388 Nicht behandelte Ablehnung von Versprechungen: Fehler beim Analysieren von Vorlagen: Kann nicht an 'appContenteditableModel' gebunden werden, da dies keine bekannte Eigenschaft von 'p' ist.
Ich habe fast alle möglichen Änderungen ausprobiert. Nach diesen eckigen Dokumenten sollte alles funktionieren, aber es funktioniert nicht.
Irgendeine Hilfe?
angular
typescript
directive
Tomas Javurek
quelle
quelle
[(appContenteditableModel)]="draftMessage.text"
am Ende ...<p [appContenteditableModel]="draftMessage.text"></p>
appContenteditableModel="draftMessage.text"
und(appContenteditableMode)l="draftMessage.text"
löst auch die Ablehnung des Versprechens, aber es scheint auch die Variable nicht zu übergebenAntworten:
Wenn Sie eine Eigenschaft in Klammern setzen
[]
, versuchen Sie, sie zu binden. Sie müssen es also als deklarieren@Input
.Der wichtige Teil ist, dass member (
appContenteditableModel
) als Eigenschaft auf dem DOM-Knoten (und in diesem Fall als Direktivenselektor) benannt werden muss.quelle
@Input ('appContenteditableModel') model : any;
und auch Ausgabe@Output ('appContenteditableModel') update : EventEmitter<any> = new EventEmitter();
in meiner Direktive. Es scheint, dass das Modell gut funktioniert, aber der von aufgerufene Emitterthis.update.emit(value)
ändert den Wert in der übergeordneten Komponente nicht. Was ich falsch mache?[(appContenteditableModel)]="draftMessage.text"
@Output
dient nur zum Aussenden von Ereignissen. Wenn Sie den Wert mit dem Wert des übergeordneten Elements synchron halten möchten, können Sie die@HostBinding
Anmerkung hinzufügen .@HostBinding
helfe, den Wert innerhalb des HTML-Elements synchron zu halten, habe ich Recht? Dieses Element muss vom Benutzer bearbeitet werden,contenteditable="true"
damit die Eingabe mit der Variablen in derselben Komponente synchron bleibt.Wenn Sie ein gemeinsam genutztes Modul zum Definieren der Direktive verwenden, stellen Sie sicher, dass es von dem Modul, in dem es definiert ist, deklariert und exportiert wird.
quelle
Für mich war die Update Bezugnahme auf die Richtlinie von der Wurzel zu bewegen
app.module.ts
(die Leitungen fürimport
,declarations
und / oderexports
) den spezielleren Modulsrc/subapp/subapp.module.ts
meiner Komponente gehörte.quelle
In der Summe, weil Ihre Direktive wie eine Anker-Direktive aussieht , entfernen Sie die Klammern und es würde funktionieren.
Tatsächlich habe ich die entsprechenden Abschnitte nicht gefunden, die sich darauf beziehen, wann die Klammern entfernt werden sollen oder nicht, wobei sich nur eine Erwähnung im Abschnitt über dynamische Komponenten befindet :
, was jedoch im Dokument Attributrichtlinien nicht perfekt behandelt wird .
Individuell stimme ich Ihnen zu und war der Meinung, dass der Parser
[appContenteditableModel]
fürappContenteditableModel
eckige Vorlagen gleich sein sollte, um zu umgehen, ob@input()
Daten automatisch gebunden werden oder nicht. Aber sie scheinen unter der Haube nicht gleich verarbeitet zu sein, selbst in der aktuellen Angular-Version von 7.quelle
Ich hatte das gleiche Problem mit einer Direktive, die in einem gemeinsam genutzten Modul deklariert wurde. Ich verwende diese Anweisung, um ein Formularsteuerelement zu deaktivieren.
Um es richtig zu machen, deklarieren und exportieren Sie die Direktive in einem gemeinsam genutzten Modul (oder einem beliebigen Modul, das Sie verwenden).
Jetzt können wir diese Direktive in jedem Modul verwenden, in das wir SharedModule importieren .
Um die Steuerung einer reaktiven Form zu deaktivieren, können wir sie folgendermaßen verwenden:
Fehler Ich habe es getan, ich habe nur den Selektor (appDisableControl) verwendet und den Deaktivierungsparameter an diesen übergeben. Um einen Eingabeparameter zu übergeben, müssen wir ihn wie oben verwenden.
quelle