2014-10-20 4 views
1

Я читал статьи о $ digest cycle и $ scope. $ Apply() как можно больше, но не мог понять, как изменить свои данные на обратном вызове.Обратный звонок никогда не называется

Это мой метод:

vm.showAllResults = showAllResults; 

function showAllResults(){ 
      // Prevent 'bubbling' 
      event.preventDefault(); 
      event.stopPropagation(); 
      // Second parameter notifies search to show full list of elements 
      vm.search(vm.input.query, true); 
      $scope.$apply(function(){ 
       vm.showAll = false; 
      }); 
     } 

vm.search (vm.input.query, правда) - делают некоторые асинхронной работы с vm.showAll тоже. Впоследствии Я хочу установить его как ложное.

Но я не могу попасть в $ scope. $ Apply(). Что я делаю не так? Благодаря!

+0

Вы получаете ошибку JavaScript? Если так, то, что это? –

+0

Действительно ли 'vm.search' выполняет какие-либо операции _asynchronous_? –

+0

Привет, нет. Просто я никогда в этой строке: vm.showAll = false; – Artem

ответ

2

Чтобы ответить на ваш вопрос прямо: я сильно подозреваю, что вы получаете console.error:

$apply already in progress

, который вызывает $ применять функцию обратного вызова, чтобы не работать.

Это означает, что вы можете обойти это, используя $timeout(cb) вместо $ scope. $ Apply (cb). Обязательно зависимостей вводить его, если вы хотите использовать его:

vm.showAllResults = showAllResults; 
 

 
function showAllResults(){ 
 
    // Prevent 'bubbling' 
 
    event.preventDefault(); 
 
    event.stopPropagation(); 
 
    // Second parameter notifies search to show full list of elements 
 
    vm.search(vm.input.query, true); 
 
    $timeout(function(){ 
 
    vm.showAll = false; 
 
    }); 
 
}

Однако, как Авраамий указывал, на мой взгляд, а, vm.search должен быть отложенный метод с использованием $q (также Dependency впрыскивается), которая возвращает обещание, и призывает .resolve/отклонить, который вы используете с .Затем, как это:

vm.showAllResults = showAllResults; 
 

 
function showAllResults(){ 
 
    // Prevent 'bubbling' 
 
    event.preventDefault(); 
 
    event.stopPropagation(); 
 
    // Second parameter notifies search to show full list of elements 
 
    vm.search(vm.input.query, true) 
 
    .then(function() { 
 
     $timeout(function() { // <-- This $timeout probably not needed... 
 
     vm.showAll = false;  
 
     }); 
 
    }); 
 
}

Смежные вопросы