在开发过程中,我遇到了两次触发模糊的问题,当我需要只触发一次时。
ng-blur和ng-enter最终操作都是向数据库发出请求,在我们的情况下,只需要1个请求,或者从ng-blur或ng-enter完成2个请求。问题是ng-enter行为导致失去对与ng-blur连接的元素的关注。
以下是我的两个问题:
有没有办法阻止Angularjs在todo div上触发ng-blur 何时执行ng-enter?
如果第一个问题没有解决方案,我真的希望那里 那么,我有什么选择?
您可以在下面看到导致我的问题的部分代码。
template.html
<div ng-repeat="todo in todos" ng-enter="stopEditTodo($index, $event, todo);" ng-dblclick="editTodo($event);">
<div class="card-details">
<div class="card-content">
<span ng-blur="stopEditTodo($index, $event, todo);">
{{todo.title}}
</span>
</div>
</div>
</div>
controller.js
app.controller('homeController', function($scope, Todos, $state){
$scope.editTodo = function($event) {
var text = angular.element(angular.element(event.currentTarget).find('span')[0]);
$event.preventDefault();
text.attr("contenteditable", "true");
}
$scope.stopEditTodo = function($index, $event, todo) {
angular.element(event.currentTarget).removeAttr('contenteditable');
}
});
directive.js
app.directive('ngEnter', function () {
return function (scope, element, attrs) {
element.bind("keydown keypress", function (event) {
if(event.which === 13) {
scope.$apply(function (){
scope.$eval(attrs.ngEnter);
});
event.preventDefault();
}
});
};
});
谢谢你的时间!
答案 0 :(得分:1)
由于split_sorted = df.pair.str.split('_').map(sorted)
df_switch = pd.concat([split_sorted.str[0],
split_sorted.str[1],
df['volume']], axis=1, keys=['country1', 'country2', 'volume'])
df_switch.groupby(['country1', 'country2'], as_index=False, sort=False).sum()
会触发 country1 country2 volume
0 CHN USA 15
1 AFG ALB 7
,因此您无法在ng-blur
中执行任何操作来阻止其发生。
另一方面,您有几个选择:
$evalAsync
触发ng-enter
请注意,所有这些都可以通过完全自定义的指令来完成,以封装直接的DOM操作。
有关示例,请参阅plunker。
这更加“hacky”但它通常可以解决问题 - 使用stopEditTodo
函数(即Lodash)使您的处理程序每X毫秒只触发一次。就是这样:
var target = angular.element(event.target);
if (target.attr('contenteditable')) {
target.removeAttr('contenteditable');
// fire request
}
这应该适用于大多数使用场景。
旁注:您似乎应该使用debounce
代替$scope.stopEditTodo = _.debounce(function($index, $event, todo) {
angular.element(event.currentTarget).removeAttr('contenteditable');
// fire request
}, 300);
,因为后者始终会引用父event.target
而不是event.currentTarget
实际列表项(你想要的)。或者,您可以将div
移动到列表项而不是父项。