ejemplos - angularjs pdf
¿Cuál es la diferencia entre ngModel. $ ModelValue y ngModel. $ ViewValue (3)
Angular tiene que realizar un seguimiento de dos vistas de los datos de ngModel: están los datos tal como los ve el DOM (navegador) y luego está la representación procesada de Angular de esos valores. $viewValue
es el valor del lado DOM. Entonces, por ejemplo, en una <input>
$viewValue
es lo que el usuario $viewValue
en su navegador.
Una vez que alguien escribe algo en <input>
, $viewValue
es procesado por $ parsers y se convierte en la vista de Angular del valor que se llama $modelView
.
Entonces puede pensar en $modelView
siendo la versión procesada de angular del valor, el valor que ve en el modelo, mientras que $viewValue
es la versión sin $viewValue
.
Para dar un paso más, imaginemos que hacemos algo que cambia el $modelView
. Angular ve este cambio y llama a $ formateadores para crear un $viewValue
actualizado (basado en el nuevo $ modelView) que se enviará al DOM.
Tengo la siguiente directiva ckEditor. En la parte inferior hay dos variaciones que he visto de ejemplos sobre cómo establecer 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);
};
}
};
}])
¿Puede alguien 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 :-(
Estás viendo la documentación correcta, pero puede ser que estés un poco confundido. $modelValue
y $viewValue
tienen una clara diferencia. Es esto:
Como ya lo mencionaste arriba:
$viewValue:
real de cadena (u objeto) en la vista.
$modelValue:
valor en el modelo al que está sujeto el control.
Voy a suponer que su ngModel se está refiriendo a un elemento <input />
...? Entonces su <input>
tiene un valor de cadena que se muestra al usuario, ¿verdad? Pero el modelo real podría ser alguna otra versión de esa cadena. Por ejemplo, la entrada puede mostrar la cadena ''200''
pero el <input type="number">
(por ejemplo) contendrá un valor de modelo de 200
como un entero. Entonces, la representación de cadena que "ve" en la <input>
es ngModel.$viewValue
y la representación numérica será ngModel.$modelValue
.
Otro ejemplo sería un <input type="date">
donde $viewValue
sería algo así como el Jan 01, 2000
y $modelValue
sería un objeto de Date
javascript real que representa esa cadena de fecha. ¿Tiene sentido?
Espero haber respondido a su pregunta.
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 renderización porque es el "modelo representado". Tendrás que hacerlo manualmente, mientras que el método de renderización se $modelValue
automáticamente sobre las modificaciones de $modelValue
.
Sin embargo, la información seguirá siendo coherente, gracias a $formatters
y $parsers
:
- Si cambia
$viewValue
,$parsers
lo traducirá a$modelValue
. - Si cambia
$modelValue
,$formatters
lo convertirán en$viewValue
.