Разовая отрисовка угловой шаблонной строки

Я пишу директиву для интеграцииSlickGrid с моим угловым приложением. Я хочу иметь возможность настроить столбцы SlickGrid с угловым шаблоном (вместо функции форматирования). Для этого мне нужна директива для динамического создания функций форматирования, которые возвращают HTML в виде строки.

Мой подход состоял в том, чтобы создать временную область, связать шаблон с этим, захватить HTML, а затем уничтожить область. Это работает, но жалуется, что$digest already in progress, Есть ли способ, которым я могу визуализировать угловой шаблон таким образом, изолированный от глобального цикла $ digest?

Кстати: я пытался использовать $ interpolate, который прекрасно работает, но нет поддержкаng-repeat или другие директивы.

var columnsConfig = [
  {
    id: "name", 
    name: "Name", 
    field: "name", 
    template: '<a href="{{context.url}}">{{value}}</a>'
  },
  {
    id: "members", 
    name: "Members", 
    field: "members", 
    template: '{{m}}'
  }
];

myModule.directive('SlickGrid', ['$compile', function($compile) {
  return {
    restrict: 'E',
    scope: {
      model: '='
    },
    link: function(scope, element, attrs) {
      var columns = angular.copy(columnsConfig);

      // Special Sauce: Allow columns to have an angular template
      // in place of a regular slick grid formatter function
      angular.forEach(columns, function(column){
        var linker;

        if (angular.isDefined(column.template)) {
          linker = $compile(angular.element('' + column.template + ''));
          delete column.template;

          column.formatter = function(row, cell, value, columnDef, dataContext) {
            var cellScope = scope.$new(true);
            cellScope.value = value;
            cellScope.context = dataContext;

            var e = linker(cellScope);
            cellScope.$apply();
            cellScope.$destroy();

            return e.html();
          };
        }
      });

      var options = {
        enableColumnReorder: false,
        enableTextSelectionOnCells: true,
        autoHeight: true
      };

      var dataView = new Slick.Data.DataView();
      var grid = new Slick.Grid(element, dataView, columns, options);

      dataView.onRowCountChanged.subscribe(function (e, args) {
        grid.updateRowCount();
        grid.render();
      });

      dataView.onRowsChanged.subscribe(function (e, args) {
        grid.invalidateRows(args.rows);
        grid.render();
      });

      scope.$watch('model', function(data) {
        if (angular.isArray(data)) {
          dataView.setItems(data);
        }
      });
    }
  };
}]);

Ответы на вопрос(2)

Ваш ответ на вопрос