Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect unsaved data using angularjs

I'm a newbie to AngularJs, so this might be trivial. Are there any inbuilt AngularJs directive to detect unsaved data in a form. If not then how to go about writing one. Any pointers would be appreciated.

html code is

<input type="text" runat="server" /> 

And my angular js controller code is

    function MyCtrl1($scope) {       // code to do stuff }MyCtrl1.$inject = ['$scope']; 

I am trying to write a directive to detect unsaved data, and I'm guessing its to be written in the above controller.Correct me if wrong.

like image 690
iJade Avatar asked Feb 13 '13 09:02

iJade


2 Answers

AngularJS sets the CSS classes ng-pristine and ng-dirty on any input field you've used ng-model on, and your FormController has the properties $pristine and $dirty which you can check to see if the form is dirty or not. So yes, it's possible.

Could you provide some code that shows what you're trying to do? That would make it easier to help you.

EDIT

Here's a simple example of how to detect a pristine/dirty state, and how to revert to a pristine state:

<!doctype html> <html ng-app> <head>     <script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>     <script type="text/javascript">     function Ctrl($scope) {         var initial = {text: 'initial value'};         $scope.myModel = angular.copy(initial);         $scope.revert = function() {             $scope.myModel = angular.copy(initial);             $scope.myForm.$setPristine();         }     }     </script> </head> <body>     <form name="myForm" ng-controller="Ctrl">         myModel.text: <input name="input" ng-model="myModel.text">         <p>myModel.text = {{myModel.text}}</p>         <p>$pristine = {{myForm.$pristine}}</p>         <p>$dirty = {{myForm.$dirty}}</p>         <button ng-click="revert()">Set pristine</button>     </form> </body> </html> 
like image 63
Anders Ekdahl Avatar answered Sep 28 '22 03:09

Anders Ekdahl


Monitoring pristine/dirty state is a good place to start, but if you want to provide user with the best possible usability, you will have to compare current form data with initial form data to detect any changes. If form is dirty it still doesn't mean that it has changed data.

I've created a very small and useful module to solve this exact problem. With it you can keep your controller code as simple as possible. It adds modified property to every model and even form controller automatically and you can reset entire form by just calling a provided reset() method, so you can concentrate on your application's business logic instead of detecting changes manually.

Please see the Demo.

You can find a distribution package as well as a source code here: https://github.com/betsol/angular-input-modified (it's also available via Bower)

If you will need any help with using this library - you can contact me personally. I will be glad to help. Cheers!

like image 41
Slava Fomin II Avatar answered Sep 28 '22 03:09

Slava Fomin II