Tengo una página web que sirve como editor para una sola entidad, que se ubica como un gráfico profundo en la propiedad $ scope.fieldcontainer. Después de recibir una respuesta de mi API REST (a través de $ resource), agrego un reloj a 'fieldcontainer'. Estoy usando este reloj para detectar si la página / entidad está "sucia". En este momento estoy haciendo que el botón Guardar rebote, pero realmente quiero hacer que el botón Guardar sea invisible hasta que el usuario ensucie el modelo.
Lo que estoy obteniendo es un solo disparador del reloj, lo que creo que está sucediendo porque la asignación .fieldcontainer = ... se lleva a cabo inmediatamente después de crear mi reloj. Estaba pensando en usar una propiedad "dirtyCount" para absorber la falsa alarma inicial, pero eso se siente muy hacky ... y pensé que tenía que haber una manera "idiomática angular" para lidiar con esto: no soy el único usando un reloj para detectar un modelo sucio.
Aquí está el código donde configuré mi reloj:
$scope.fieldcontainer = Message.get({id: $scope.entityId },
function(message,headers) {
$scope.$watch('fieldcontainer',
function() {
console.log("model is dirty.");
if ($scope.visibility.saveButton) {
$('#saveMessageButtonRow').effect("bounce", { times:5, direction: 'right' }, 300);
}
}, true);
});
Solo sigo pensando que debe haber una forma más limpia de hacerlo que proteger mi código de "ensuciamiento de la interfaz de usuario" con un "if (dirtyCount> 0)" ...
fuente
undefined
. Tiene un valor predeterminado que es necesario en el caso de que la actualización de mi modelo no proporcione toda la información. Por lo tanto, algunos valores no cambian pero tienen que activarse.Respuestas:
establecer una bandera justo antes de la carga inicial,
y luego, cuando se dispara el primer $ watch,
La bandera se derribará justo al final del ciclo de resumen actual, por lo que el próximo cambio no se bloqueará.
fuente
La primera vez que se llama al oyente, el valor antiguo y el nuevo valor serán idénticos. Entonces solo haz esto:
Esta es realmente la forma en que los documentos de Angular recomiendan manejarlo :
fuente
null
el valor cargado inicial, no ignorar el cambio cuando no hay cambio.null
.oldValue
será nulo en la primera vuelta.Me doy cuenta de que esta pregunta ha sido respondida, sin embargo, tengo una sugerencia:
El uso de banderas funciona pero tiene un poco de olor a código , ¿no le parece?
fuente
return unless oldValue?
(? Es el operador existencial en CS).Durante la carga inicial de los valores actuales, el campo de valor antiguo no está definido. Entonces, el siguiente ejemplo lo ayuda a excluir las cargas iniciales.
fuente
null
yundefined
coincidirá en esta situación, o ('1' == 1
etc.)Solo valido el estado del nuevo val:
fuente