2014-11-07 2 views
0

Я испытываю странную ситуацию с угловыми. У меня есть значение, связанное с директивой, и мне нужно иметь возможность проверять и управлять этим значением как с контроллера, так и с директивы. У меня также есть метод как свойство объекта, связанного с директивой, которую мне нужно вызвать из контроллера. Ожидается, что этот метод будет реагировать соответственно на связанное значение.angularjs - ожидая значения, которое должно быть связано с директивой

Вот некоторые псевдо-код для иллюстрации:

.controller('ctrl', function(){ 
    $scope.someAction = function(){ 
     $scope.myValue = undefined; 
     $scope.someObject.myMethod(); 
    }; 
}); 

.directive('myDirective', ...){ 
    return { 
     ... 
     scope: { myValue: '=', someObject: '=' }, 
     link: function (scope) { 
      scope.someObject = { 
       myMethod: function(){ 
        if (angular.isDefined(scope.myValue)){ 
         // do something 
        } 
        else { 
         // do something else 
        } 
       } 
      }; 
     } 
    } 
} 

и в шаблоне контроллера:

<my-directive my-value="myValue" some-object="someObject"></my-directive> 

Я бы ожидать, что, когда «SomeAction» срабатывает «MyValue» установлено значение не определено и метод «someObject.myMethod» вызывается из контроллера, «myValue» в директиве не определен, но это не так. Однако, если я обернуть вызов метода в $ тайм-аут, который ждет только 1 миллисекунду, я получаю ожидаемое поведение:

.controller('ctrl', function($timeout){ 
    $scope.someAction = function(){ 
     $scope.myValue = undefined; 
     $timeout(function() { 
      $scope.someObject.myMethod(); 
     }, 1); 
    }; 
}); 

Этот хак решил мою проблему, но я бы предпочел, чтобы понять, что происходит и возможно, решить его (или избежать) более элегантно ...

ответ

0

Функция вашего контроллера $ scope.someAction завернута угловым в $ apply call. Поэтому, вероятно, когда вы вызываете $ scope.someObject.myMethod(), изолированная область действия директивы не обновляется, потому что $ apply не заканчивается. Решение было бы сделать то, что вы предложили: $timeout(function() { $scope.someObject.myMethod(); }, 0);

Тайм-аут будет отсрочен до выполнения функции до следующего вызова $ apply, чтобы ваша директива увидела обновленное значение.

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