2014-11-19 2 views
3

Я использую ng-focus и ng-blur, чтобы показать/скрыть кнопку. на focus ввода, кнопка показана и на blur скрыта. Показать/скрыть выполняется с использованием ng-show. При нажатии этой кнопки вызывается функция.Apply delay on ng-blur

Live Demo

Проблема в том, что ng-blur нас называют первыми и кнопка становится скрыта до события нажатия обжигает, поэтому функция, которая должна быть вызвана из этой кнопки никогда не вызывалось.

Я уже исправил это, используя setTimeout(), но позже обнаружил, что это не очень хорошее решение. Есть ли другой способ исправить эту проблему?

+0

Что об этом http://jsfiddle.net/m8ab96su/3/ – dfsq

+0

Что о полностью удалить кнопку и добавить логику на событие размытия. –

+0

@dfsq, как я уже сказал, я могу, действительно удалить ng-blur. –

ответ

4

использование ng-mouseover и ng-mouseleave изменить кнопку

 <button ng-click="click()" ng-show="show||mouseover" ng-mouseover="mouseover=true" ng-mouseleave="mouseover=false">Click to change</button> 

demo

+0

Прошу прощения, но ваша скрипка не работает. –

+0

ohhh я извиняюсь, это исправлено – Ebrahimi

+0

круто, что работает! но не могли бы вы объяснить, что вы там сделали? –

1

Почему вы не меняете $scope.show=false; в событии нажатия кнопки.

Другими словами, удалите событие размытия, и событие click будет таким.

$scope.click = function(){ 
    alert("fuu") 
    $scope.text = "We changed it"; 
    $scope.show=false;  
} 
+0

Вы предполагаете, что я должен удалить ng-blur? –

+0

Я не могу удалить ng-blur. Я хочу, чтобы эта кнопка была скрыта от размытия ввода. –

+0

Хорошо, хорошо. Нам нужно думать в другом решении –

0

Я думаю, что с помощью BOOL может помочь вам определить состояние, если это необходимо, чтобы скрыть или показать кнопка. При наведении курсора на кнопку изменить bool, чтобы определить выполнение функции размытия.

пробуйте это пути:

HTML:

<div ng-app ng-controller="LoginController"> 
    <div>{{ text }}</div> 
    <input ng-focus="focus()" ng-blur="blur()"></input> 
    <button ng-click="click()" ng-show="show==true" ng-mouseover="mouseover()">Click to change</button> 
</div> 

angularjs:

function LoginController($scope) { 
    $scope.show=false; 
    $scope.blurAll = true; 
    $scope.text = "this thing will change on click"; 

    $scope.focus = function(){ 
     console.log("buu"); 
     $scope.show=true; 
    } 
    $scope.blur = function(){ 
     if(blurAll){ 
      console.log("baaa"); 
      $scope.show=false; 
     } 
    } 

    $scope.click = function(){ 
      alert("fuu"); 
      $scope.text = "We changed it"; 
      $scope.show = false; 

    } 

    $scope.mouseover = function(){ 
     blurAll = false; 
    }; 
} 

jsFiddle

0

использовать собственную директиву, которая ввести задержку

app.directive('ngBlurDelay',['$timeout',function($timeout){ 
return { 
    scope:{ 
     ngBlurDelay:'&' 
    }, 
    link:function(scope, element, attr){ 
    element.bind('blur',function(){ 
     $timeout(scope.ngBlurDelay,200); 
    }); 
    } 
}; 
}])