单击保存按钮时会触发ng-blur事件,如何触发ng-click事件按钮?如果我点击按钮或输入字段,我仍然希望触发ng-blur事件。
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: {}
}
};
});
答案 0 :(得分:72)
而不是ng-click
,请使用ng-mousedown
。在模糊事件之前,Mousedown事件会被触发。
但是,处理的mousedown可能会在没有触发模糊事件的情况下取消对焦。 如果您在框外单击,则不会触发模糊事件(因为该字段已经模糊),因此在设置焦点后,您可能需要手动重新对焦字段 - 请参阅 How to set focus on input field?
请注意,通过使用此方法,也可以使用右键单击(感谢Alexandros Vellis!)来触发按钮,如this official example中所示。
答案 1 :(得分:4)
请勿使用ng-blur
,然后将$document
与click
事件绑定以停止编辑模式。并且记得在范围被破坏时取消绑定事件。
答案 2 :(得分:1)
如果您想在ng-blur
之前运行点击事件功能,而不是在ng-mousedown
事件ng-click
中编写您的功能。