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: {} } }; });
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.
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.
The ng-click directive tells AngularJS what to do when an HTML element is clicked.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With