Ich habe die folgende ckEditor-Direktive. Unten sind zwei Variationen aufgeführt, die ich anhand von Beispielen zum Festlegen der Daten im Editor gesehen habe:
app.directive('ckEditor', [function () {
return {
require: '?ngModel',
link: function ($scope, elm, attr, ngModel) {
var ck = null;
var config = attr.editorSize;
if (config == 'wide') {
ck = CKEDITOR.replace(elm[0], { customConfig: 'config-wide.js' });
} else {
ck = CKEDITOR.replace(elm[0], { customConfig: 'config-narrow.js' });
}
function updateModel() {
$scope.$apply(function () {
ngModel.$setViewValue(ck.getData());
});
}
$scope.$on('modalObjectSet', function (e, modalData) {
// force a call to render
ngModel.$render();
});
ck.on('change', updateModel);
ck.on('mode', updateModel);
ck.on('key', updateModel);
ck.on('dataReady', updateModel);
ck.on('instanceReady', function () {
ngModel.$render();
});
ck.on('insertElement', function () {
setTimeout(function () {
$scope.$apply(function () {
ngModel.$setViewValue(ck.getData());
});
}, 1000);
});
ngModel.$render = function (value) {
ck.setData(ngModel.$modelValue);
};
ngModel.$render = function (value) {
ck.setData(ngModel.$viewValue);
};
}
};
}])
Kann mir jemand sagen, was der Unterschied ist zwischen:
ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);
Und welches soll ich benutzen. Ich habe mir die eckige Dokumentation angesehen und dort steht:
$viewValue
Actual string value in the view.
$modelValue
The value in the model, that the control is bound to.
Ich habe keine Ahnung, was der Autor meinte, als er dies in das Dokument schrieb :-(
$viewValue
immer eine Zeichenfolge?$viewValue: Actual string value in the view.
. Also ja.<input type="text">
Wert leer ist, das$modelValue
ist Eigentumundefined
, während das$viewValue
ist''
leerer String. Dies kann einen Unterschied machen, wenn Sie an der "Länge" der schnüffeln, die$modelValue
nicht funktioniert, aber funktioniert$viewValue
.$viewValue
ist nicht immer eine Zeichenfolge. Es ist eine Zeichenfolge für die aktuellen Angular-Kernanweisungen, kann jedoch ein Grundelement oder ein Objekt in Ihren benutzerdefinierten Steuerelementen sein. Ein gutes Beispiel ist die<input file="type">
Komponente, in der viewValue einFileList
Objekt mit vom Benutzer angehängten Dateien enthält . Die Angular-Dokumente sind derzeit verwirrend und sollten aktualisiert werden.Sie können solche Dinge sehen:
$modelValue
ist Ihre externe API, dh etwas, das Ihrem Controller ausgesetzt ist.$viewValue
Ist Ihre interne API, sollten Sie sie nur intern verwenden.Beim Bearbeiten
$viewValue
wird die Rendermethode nicht aufgerufen, da es sich um das "gerenderte Modell" handelt. Sie müssen dies manuell tun, während die Rendermethode bei$modelValue
Änderungen automatisch aufgerufen wird .Die Informationen bleiben jedoch dank
$formatters
und erhalten$parsers
:$viewValue
,$parsers
wird es zurück in übersetzt$modelValue
.$modelValue
,$formatters
wird es in konvertieren$viewValue
.quelle
$viewValue
über einesetViewValue(viewValue)
Methode treten Parser / Validatoren (falls vorhanden) ein und analysieren dieseviewValue
in den modelValue, validieren sie, schreiben sie in den Bereich und treten dann ausviewChangeListeners
. Bei der nächsten Ausführung des Digests wird der Modellwert aus dem Bereich abgerufen und mit dem $ modelValue im Controller verglichen: github.com/angular/angular.js/blob/master/src/ng/directive/… . Wenn sie gleich sind (und in Ihrem Szenario gleich sind), wird sie zurückgegeben.Angular muss zwei Ansichten von ngModel-Daten verfolgen - es gibt die Daten, die vom DOM (Browser) gesehen werden, und dann gibt es Angulars verarbeitete Darstellung dieser Werte. Das
$viewValue
ist der DOM Seiten Wert. So hat beispielsweise der Benutzer in einem<input>
das$viewValue
eingegeben, was der Benutzer in seinen Browser eingegeben hat.Sobald jemand etwas
<input>
eingibt,$viewValue
wird es von $ parsers verarbeitet und in Angulars Ansicht des aufgerufenen Werts umgewandelt$modelValue
.Sie können sich also vorstellen,
$modelValue
dass Angulars verarbeitete Version des Werts der Wert ist, den Sie im Modell sehen, während$viewValue
es sich um die Rohversion handelt.Um diesen Schritt weiter zu gehen, stellen Sie sich vor, wir tun etwas, das das verändert
$modelValue
. Angular erkennt diese Änderung und ruft $ formatters auf, um ein aktualisiertes$viewValue
(basierend auf dem neuen $ modelValue) zu erstellen, das an das DOM gesendet werden soll.quelle