Mam stronę internetową, która służy jako edytor dla pojedynczego elementu, który znajduje się jako głęboki wykres we właściwości $ scope.fieldcontainer. Po otrzymaniu odpowiedzi z mojego interfejsu API REST (za pośrednictwem zasobu $) dodaję zegarek do 'fieldcontainer'. Używam tego zegarka do wykrywania, czy strona / jednostka jest „brudna”. W tej chwili odbijam przycisk Zapisz, ale naprawdę chcę, aby przycisk Zapisz był niewidoczny, dopóki użytkownik nie zabrudzi modelu.
To, co otrzymuję, to pojedynczy spust zegarka, który, jak sądzę, dzieje się, ponieważ przypisanie .fieldcontainer = ... ma miejsce natychmiast po utworzeniu mojego zegarka. Myślałem o użyciu po prostu właściwości „dirtyCount” do zaabsorbowania początkowego fałszywego alarmu, ale wydaje mi się to bardzo hackerskie ... i pomyślałem, że musi istnieć sposób „Angular idiomatic”, aby sobie z tym poradzić - nie jestem jedyny za pomocą zegarka, aby wykryć brudny model.
Oto kod, w którym ustawiam zegarek:
$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);
});
Po prostu myślę, że musi istnieć czystszy sposób, aby to zrobić, niż pilnowanie mojego kodu „UI dirtying” za pomocą „if (dirtyCount> 0)” ...
źródło
undefined
. Ma wartość domyślną, która jest niezbędna, w przypadku mojej aktualizacji modelu nie pojawiły się wszystkie informacje. Dlatego niektóre wartości nie zmieniają się, ale muszą zostać wyzwolone.Odpowiedzi:
ustaw flagę tuż przed początkowym ładowaniem,
a potem, gdy wystrzeli pierwszy zegarek, zrób
Flaga zostanie zburzona tuż po zakończeniu bieżącego cyklu podsumowania, więc następna zmiana nie zostanie zablokowana.
źródło
Przy pierwszym wywołaniu detektora stara wartość i nowa wartość będą identyczne. Po prostu zrób to:
W ten sposób doktorzy Angular zalecają obchodzenie się z tym :
źródło
null
początkowej wartości załadowanej, aby nie ignorować zmiany, gdy nie ma zmiany.null
.oldValue
przy pierwszym odejściu będzie zerowane.Zdaję sobie sprawę, że na to pytanie udzielono odpowiedzi, jednak mam sugestię:
Używanie flag działa, ale wyczuwa zapach kodu , nie sądzisz?
źródło
return unless oldValue?
(? Operator egzystencjalny w CS).Podczas początkowego ładowania bieżących wartości stare pole wartości jest niezdefiniowane. Poniższy przykład pomaga w wykluczeniu początkowych obciążeń.
źródło
null
iundefined
będzie pasować w tej sytuacji, lub ('1' == 1
itp.)Po prostu popraw stan nowej wartości:
źródło