Tengo la siguiente directiva ckEditor. En la parte inferior hay dos variaciones que he visto en ejemplos sobre cómo configurar los datos en el editor:
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);
};
}
};
}])
¿Alguien puede decirme cuál es la diferencia entre:
ck.setData(ngModel.$modelValue);
ck.setData(ngModel.$viewValue);
Y cuál debería usar. Miré la documentación angular y dice:
$viewValue
Actual string value in the view.
$modelValue
The value in the model, that the control is bound to.
No tengo idea de lo que quiso decir el autor cuando escribió esto en el documento :-(
$viewValue
es siempre una cuerda?$viewValue: Actual string value in the view.
. Entonces sí.<input type="text">
valor está vacío, la$modelValue
propiedad esundefined
, mientras que$viewValue
es una''
cadena vacía. Esto puede marcar la diferencia si está olfateando la "longitud" del$modelValue
que no funcionará, pero$viewValue
sí.$viewValue
no siempre es una cadena. Es una cadena para las directivas centrales actuales de Angular, pero puede ser una primitiva o un Objeto en sus controles personalizados. Un buen ejemplo es el<input file="type">
componente, donde viewValue contiene unFileList
objeto con archivos adjuntos por el usuario. Los documentos de Angular son confusos sobre esto en este momento y deberían actualizarse.Puedes ver cosas como esta:
$modelValue
es su API externa, es decir, algo expuesto a su controlador.$viewValue
es su API interna, debe usarla solo internamente.Al editar
$viewValue
, no se llamará al método de renderizado, porque es el "modelo renderizado". Tendrá que hacerlo manualmente, mientras que el método de renderizado se llamará automáticamente al realizar$modelValue
modificaciones.Sin embargo, la información seguirá siendo consistente, gracias a
$formatters
y$parsers
:$viewValue
,$parsers
lo traducirá de nuevo a$modelValue
.$modelValue
,$formatters
lo convertirá a$viewValue
.fuente
$viewValue
través delsetViewValue(viewValue)
método, los analizadores / validadores seviewValue
activan (si los hay) y lo analizan en modelValue, lo validan, lo escriben en el alcance y luego lo apaganviewChangeListeners
. La próxima vez que se ejecute el resumen, el valor del modelo se recupera del alcance y se compara con $ modelValue en el controlador: github.com/angular/angular.js/blob/master/src/ng/directive/… . Si son iguales (y serán iguales en su escenario), regresa.Angular tiene que realizar un seguimiento de dos vistas de los datos de ngModel: están los datos como los ve el DOM (navegador) y luego está la representación procesada de Angular de esos valores. El
$viewValue
es el valor lado DOM. Así, por ejemplo, en un<input>
el$viewValue
es lo que el usuario escribió en su navegador.Una vez que alguien escribe algo en
<input>
continuación,$viewValue
se procesa por $ analizadores y convertido en vista de angular del valor que se llama$modelValue
.Entonces, puede pensar en
$modelValue
ser la versión procesada de angular del valor, el valor que ve en el modelo, mientras que$viewValue
es la versión sin procesar.Para dar un paso más, imagine que hacemos algo que cambia la
$modelValue
. Angular ve este cambio y llama a $ formateadores para crear una actualización$viewValue
(basada en el nuevo $ modelValue) que se enviará al DOM.fuente