2013-09-02 2 views
0

В моем контроллере я установил переменную «данные» в значение по умолчанию. В моем исходном проекте я использую CouchCorner для извлечения данных из CouchDB и обновления данных.

В пределах раздумий я наблюдаю за переменными данными и соответствующим образом обновляю элемент. Тем не менее, я столкнулся с проблемой «$ digest уже в процессе», что приводит к тому, что редуктор не обновляется правильно. Я уже нашел много информации о проблеме $ digest, но я не мог найти ответа, который бы соответствовал моей проблеме.

Я создал следующий jsFiddle, который использует $ таймаут вместо фактического запроса CouchDB: http://jsfiddle.net/cwesM/4/

var App = angular.module('myApp', []); 

function Ctrl($scope, $timeout) { 
$scope.data="Initial"; 

$timeout(function(){ 
    $scope.data="Updated"}, 1) 
} 

App.directive('chart', function(){ 
    return{ 
     restrict: 'E', 
     link: function(scope, elem, attrs){ 
      scope.$watch(attrs.ngModel, function(v){ 
       alert(v) 
       elem.html("Data="+v); 
      }); 
     } 
    }; 
}); 

Скрипт изменяет начальное значение «данные» в «Обновление» после 1мс. Но директива не обновляется, хотя функция $ watch выполняется. Интересно, если я удалю предупреждение(), все будет работать так, как ожидалось.

Как я могу избежать столкновения $ digest?

+0

Я не понимаю. JsFiddle, с которым вы связаны, похоже, работает точно так, как я ожидал. –

+0

Пожалуйста, снова нажмите «запустить» в скрипаче. Иногда он работает впервые, но не повторен. Как-то проблема загрузки/выполнения. – avanc

+0

Я запустил его дюжину раз, все с ожидаемыми результатами (Chrome). В каком браузере вы это делаете? –

ответ

0

Вы можете использовать решение, размещенное здесь, в stackoverflow.com/a/17510699 (Ответа на этот вопрос @Dor Cohen).

Я помогу вам собрать его вместе с вашим текущим кодом.

var App = angular.module('myApp', []); 

function Ctrl($scope, $timeout) { 
    $scope.data = "Initial"; 
    $timeout(function() { 
     $scope.data = "Updated" 
    }, 1); 

    $scope.alert = function (info) { 
     alert(info); 
    } 

    $scope.safeApply = function (fn) { 
     var phase = this.$root.$$phase; 
     if (phase == '$apply' || phase == '$digest') { 
      if (fn && (typeof (fn) === 'function')) { 
       fn(); 
      } 
     } else { 
      this.$apply(fn); 
     } 
    }; 
} 

App.directive('chart', function() { 
    return { 
     restrict: 'E', 
     link: function (scope, elem, attrs) { 
      scope.$watch(attrs.ngModel, function (v) { 
       scope.safeApply(function() { 
        alert(v); 
       }); 
       elem.html("Data=" + v); 
      }); 
     } 
    }; 
}); 
+0

Спасибо за подсказку. Но я использую предупреждение только для того, чтобы получить некоторые задержки в В противном случае проблема не возникнет. Позвольте мне посмотреть, если Я могу вызвать проблему по-другому. – avanc

+0

@avanc Проблема заключалась в том, что проблема была разобщена угловым перевариванием в firefox. И этот подход может помешать этому. Я совершенно не понимаю, чего вы хотите достичь. Если вы хотите просто задержать его, вы можете использовать $ timeout. – zsong

+0

Такое же поведение (иногда работает, иногда нет): http://jsfiddle.net/cwesM/5/ – avanc

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