Как получить доступ к области действия из директивы функции компилятора?

У меня есть директива построения HTML на основе массива, отправленного в качестве атрибута. Я не могу получить к нему доступ из функции компилятора директивы. Он работает внутри функции ссылки, но мне нужно внутри компиляции, иначе новый шаблон не скомпилируется.

Код выглядит так:

<multirangeslider values="ranges" variances="['Master', 'master A', 'master B']"></multirangeslider>

Директива:

angular.module("vtApp.directives").
directive('multirangeslider', function ($parse, $timeout, $compile) {
    return {
        restrict: 'E',
        replace: true,
        scope: {
            values: "=",
            options: "=",
            variances: "&" 
        },
        compile: function (element, attrs) {
            var htmlText, variances, values;
            variances = eval(attrs.variances);

            values = scope.ranges //scope is undefined
            values = eval (attrs.variances) //returns string "ranges"
            values = ???  ///what should I put here?

            htmlText = '<div></div>';
            element.replaceWith(htmlText);
            return function (scope, element, attrs){

            }
        }
    }
});

Поблагодарить

1 ответ

Решение

У вас не будет доступа к области действия, пока функция LinkingFunction не будет возвращена вашей функцией компиляции. Функция компиляции создает HTML-шаблон. Область затем объединяется с шаблоном во время LinkingFunction.

Я не совсем уверен, что вы пытаетесь сделать, но я бы использовал стандартный объект template или templateUrl в функции связывания, а не погружался в функцию компиляции. Примерно так:

angular.module("vtApp.directives").
  directive('multirangeslider', function ($parse, $timeout, $compile) {
    return {
      restrict: 'E',
      replace: true,
      template: "<div ng-repeat='val in values'>{{val}}</div>", //Your template code
      scope: {
        values: "=",
        options: "=",
        variances: "&" 
      },
      link: function (scope, element, attrs) {
        scope.values = eval(attrs.variances)
      }
    }
  });

Вы можете найти больше информации здесь о том, как создаются директивы: https://github.com/angular/angular.js/wiki/Understanding-Directives

Другие вопросы по тегам