J'ai la directive ckEditor suivante. En bas se trouvent deux variantes que j'ai vues à partir d'exemples sur la façon de définir les données dans l'éditeur:
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);
};
}
};
}])
Quelqu'un peut-il me dire quelle est la différence entre:
ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);
Et lequel dois-je utiliser. J'ai regardé la documentation angulaire et il est dit:
$viewValue
Actual string value in the view.
$modelValue
The value in the model, that the control is bound to.
Je n'ai aucune idée de ce que l'auteur voulait dire quand il a écrit ceci dans le document :-(
$viewValue
est-ce toujours une chaîne?$viewValue: Actual string value in the view.
. Donc oui.<input type="text">
valeur est vide, la$modelValue
propriété estundefined
, tandis que la$viewValue
est''
une chaîne vide. Cela peut faire une différence si vous reniflez la "longueur" de ce$modelValue
qui ne fonctionnera pas, mais le$viewValue
fera.$viewValue
n'est pas toujours une chaîne. Il s'agit d'une chaîne pour les directives de base angulaires actuelles, mais il peut s'agir d'une primitive ou d'un objet dans vos contrôles personnalisés. Un bon exemple est le<input file="type">
composant, où viewValue contient unFileList
objet avec des fichiers attachés par l'utilisateur. Les documents Angular sont déroutants à ce sujet pour le moment et devraient être mis à jour.Vous pouvez voir des choses comme ceci:
$modelValue
est votre API externe, c'est-à-dire quelque chose exposé à votre contrôleur.$viewValue
est votre API interne, vous ne devez l'utiliser qu'en interne.Lors de l'édition
$viewValue
, la méthode de rendu ne sera pas appelée, car il s'agit du "modèle rendu". Vous devrez le faire manuellement, tandis que la méthode de rendu sera appelée automatiquement lors des$modelValue
modifications.Cependant, les informations resteront cohérentes, grâce à
$formatters
et$parsers
:$viewValue
,$parsers
le traduira de nouveau en$modelValue
.$modelValue
,$formatters
le convertira en$viewValue
.la source
$viewValue
via lasetViewValue(viewValue)
méthode, les analyseurs / validateurs entrent en jeu (le cas échéant) etviewValue
analysent cela dans la valeur de modèle, le valident, l'écrivent dans la portée, puis le coupentviewChangeListeners
. Lors de la prochaine exécution du résumé, la valeur du modèle est extraite de la portée et comparée à la valeur $ modelValue dans le contrôleur: github.com/angular/angular.js/blob/master/src/ng/directive/… . S'ils sont égaux (et ils seront égaux dans votre scénario), alors il revient.Angular doit garder une trace de deux vues des données ngModel - il y a les données vues par le DOM (navigateur), puis il y a la représentation traitée par Angular de ces valeurs. Le
$viewValue
est la valeur côté DOM. Ainsi, par exemple, dans un<input>
le$viewValue
est ce que l'utilisateur a tapé dans son navigateur.Une fois que quelqu'un tape quelque chose,
<input>
il$viewValue
est traité par $ parsers et transformé en vue Angular de la valeur qui est appelée$modelValue
.Ainsi, vous pouvez penser à
$modelValue
la version traitée angulaire de la valeur, la valeur que vous voyez dans le modèle, alors que$viewValue
c'est la version brute.Pour aller plus loin, imaginez que nous faisons quelque chose qui change le
$modelValue
. Angular voit ce changement et appelle $ formateurs pour créer une mise à jour$viewValue
(basée sur le nouveau $ modelValue) à envoyer au DOM.la source