How do I ignore the initial load when watching model changes in AngularJS?

I have a web page that serves as the editor for a single entity, which sits as a deep graph in the $scope.fieldcontainer property. After I get a response from my REST API (via $resource), I add a watch to ‘fieldcontainer’. I am using this watch to detect if the page/entity is “dirty”. Right now I’m making the save button bounce but really I want to make the save button invisible until the user dirties the model.

What I am getting is a single trigger of the watch, which I think is happening because the .fieldcontainer = … assignment takes place immediately after I create my watch. I was thinking of just using a “dirtyCount” property to absorb the initial false alarm but that feels very hacky … and I figured there has to be an “Angular idiomatic” way to deal with this – I’m not the only one using a watch to detect a dirty model.

Here’s the code where I set my watch:

 $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);
            });

I just keep thinking there’s got to be a cleaner way to do this than guarding my “UI dirtying” code with an “if (dirtyCount >0)”…

5 Answers
5

Leave a Comment