2017-02-15 23 views
4

Я хочу вызвать метод контроллера после директивы сделали изменения в DOM, но она не работает, так что я отправить этот метод в директиве, которая будучи под названием внутри scope.$watchвызов метода контроллера в директиве работает с областью действия, но не с attrs?

.directive('checkThis', function($timeout) { 
    return { 
     restrict: 'E', 
     scope: { 
      myData: '=', 
      dirty: '=', 
      what: '@', 
      callback: '&' 
     }, 
     link: function(scope, element, attrs) { 
      scope.$watch('myData', function(newValue, oldValue) { 
       if (newValue !== oldValue) { 
        if (newValue) { 
         scope.dirty++; 
        } else { 
         scope.dirty--; 
        } 
        check(); 
       } 
      }); 

      var check = function() { 
       if (angular.isDefined(scope.callback)) { 
        $timeout(function() { 
         console.log('being called'); 
         scope.callback(); 
        }, 0, false); 
       } 
      }; 
     } 
    }; 
}); 

и использовать эту директиву в HTML как показано ниже

<check-this my-data="vm.encryption" dirty="vm.dirty" what="column" callback="vm.checkAll()"></check-this> 

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

Почему такое поведение так?

даже я попытался scope.$eval(attrs.callback) и

scope.$apply(function() { 
    scope.$eval(attrs.callback); 
}); 

, но это не вызывался. Я принимаю ссылки от this article

ответ

0

Угловая директива attrs - это строки, поэтому вызов attrs.callback - это строка 'vm.checkAll()' в вашем примере. Использование $eval может работать, но это не рекомендуется, так как это может нанести ущерб безопасности вашего приложения.

Решение должно использовать scope.callback(), есть ли причина, по которой вы не хотите ее использовать?

Если по какой-то причине вам абсолютно необходимо использовать attrs.callback, вы можете использовать scope.$parent.$eval(attrs.callback); или eval('scope.$parent.' + attrs.callback), потому что они будут оценивать vm.checkAll() в родительской области.

scope.$eval(attrs.callback) не будет работать, потому что ваша директива использует изоляционную область.

+0

Вы можете просто вызвать 'scope. $ Eval (attrs.callback)'; нет необходимости конкатенировать '$ scope.' там. –

+0

Благодарим вас за комментирование. Хотя вы не совсем правильно (нужно '$ parent' из-за изолированной области), вы помогли мне понять мою ошибку. Ответ исправлен. –