Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I force ng-click to take precedence over an ng-blur event?

Tags:

angularjs

blur

When I click the save button it triggers an ng-blur event, how can I make the buttons ng-click event to trigger instead? I still want the ng-blur event to trigger if I click outsida the button or input field.

http://jsfiddle.net/tidelipop/wyjdT/

angular.module('MyApp', [])  .filter("placeholder", function(){     return function (text, length, end) {         //console.log(typeof text, text, length);         if(typeof text === 'undefined' || text == ''){             text = 'Click to edit...';         }         return text;     }; })  .directive("inlineEdit", function($compile, $q){     return {         restrict: "A",         replace: true,         template: function(tElement, tAttrs){             var modelStr = tAttrs.inlineEdit, optionsStr = tAttrs.options, modelXtra = '', editElStr = '';             if(tAttrs.type === 'selectbox'){                 modelXtra = '.value';                 editElStr = '<select ng-show="editMode" ng-blur="endEdit(\''+modelStr+'\')" ng-model="'+modelStr+'" ng-options="a.value for a in '+optionsStr+'"></select>';             }else if(tAttrs.type === 'textarea'){                 editElStr = '<textarea ng-show="editMode" ng-blur="endEdit(\''+modelStr+'\')" ng-model="'+modelStr+'"></textarea>';             }else{                 editElStr = '<input type="text" ng-show="editMode" ng-blur="endEdit(\''+modelStr+'\')" ng-model="'+modelStr+'" />';             }             return '<div class="body">'+                        '<span ng-hide="editMode" ng-click="startEdit(\''+modelStr+'\', \''+optionsStr+'\')" ng-bind="'+modelStr+modelXtra+' | placeholder"></span>'+                        editElStr+'<button ng-show="editMode" ng-click="save()">save</button>'+                    '</div>';         },         scope: true,         controller: function($scope){             $scope.editMode = false;             $scope.save = function(){                 console.log("Saving...");                 $scope.editMode = false;             };             $scope.startEdit = function(modelStr, optionsStr){                 console.log("Start edit mode...");                 // Store original value, to be restored if not saving...                 $scope.origValue = $scope.$eval(modelStr);                 // If selectbox and no initial value, do init to first option                 if(typeof $scope.origValue === 'object' && typeof $scope.origValue.value !== 'string'){                     $scope.$eval(modelStr+'='+optionsStr+'[0]');                 }                 // Turn on edit mode                 $scope.editMode = true;             };             $scope.endEdit = function(modelStr){                 console.log("End edit mode...");                 // Restore original value                 $scope.$eval(modelStr+'=origValue');                 // Turn off edit mode                 $scope.editMode = false;             };         }     } })   .controller("UserAdminCtrl", function($scope){     $scope.options = {};     $scope.options.cars = [         { "key": 0, "value": "Audi" },         { "key": 1, "value": "BMW" },         { "key": 2, "value": "Volvo" }     ];     $scope.data_copy = {         user: {             user_id: 'sevaxahe',             comment: '',             my_car: {}         }     };  }); 
like image 847
tidelipop Avatar asked Sep 11 '13 08:09

tidelipop


People also ask

What is the difference between Ng-click and Onclick?

Another significant difference between ng-click and onclick is the execution context. Code inside an onclick attribute executes against the global window object, while an expression inside of ng-click executes against a specific scope object, typically the scope object representing the model for the current controller.

How does ng blur work?

The ng-blur directive tells AngularJS what to do when an HTML element loses focus. The ng-blur directive from AngularJS will not override the element's original onblur event, both the ng-blur expression and the original onblur event will be executed.

What is the use of NG-click?

The ng-click directive tells AngularJS what to do when an HTML element is clicked.

What does Blur do in angular?

A blur event fires when an element has lost focus. Note: As the blur event is executed synchronously also during DOM manipulations (e.g. removing a focussed input), AngularJS executes the expression using scope.


1 Answers

Instead of ng-click, use ng-mousedown. Mousedown events get fired before blur events.

However, the handled mousedown might un-focus your field without the blur event being fired. If you then click outside the box, the blur event won't be fired (because the field is already blurred), so after setting focus, you might need to re-focus the field manually - see How to set focus on input field?

Note that by using this approach, the button can also be triggered using right-click (thanks Alexandros Vellis!) as you can see in this official example.

like image 95
Uli Köhler Avatar answered Sep 21 '22 19:09

Uli Köhler