2013-10-04 3 views
2

У меня возникла проблема с областью, потерянной при использовании компиляции $, чтобы создать динамический шаблон для моей директивы. Смотрите ниже код (обрезанный для ясности):

(function() { 
'use strict'; 

angular.module('cdt.dm.directives').directive('serviceSources', ['$http', '$templateCache', '$compile', '$parse', 
function ($http, $templateCache, $compile, $parse) { 
    return { 
     restrict: 'E', 
     replace: true, 
     scope: { 
      type: '=', 
      sources: '=' 
     }, 
     link: function (scope, element, attr) { 
      var template = 'Template_' + scope.type + '.html'; 

      $http.get(template, { cache: $templateCache }).success(function (tplContent) { 
       element.replaceWith($compile(tplContent)(scope)); 
      }); 

      $compile(element.contents())(scope); 
     } 
    } 
} 
]) 
})(); 

, который работает и шаблон HTML загружается.

шаблон HTML выглядит следующим образом:

<table> 
<thead> 
    <tr> 
     <th>File</th>   
    </tr> 
</thead> 
<tbody data-ng-reapeat="src in sources"> 
    <tr> 
     <td>{{src.fileName}}</td> 
    </tr> 
</tbody> 

источников представляет собой массив из двух элементов. В рамках директивы это определенно правильно, но в шаблоне ng-repeat не работает (я думаю, потому что на данном этапе источники не определены).

Кто-нибудь знает, что я делаю неправильно?

+3

Интересно, можете ли вы просто использовать 'templateUrl' вместо этого? –

+0

Нет, шаблон должен быть динамическим, основанным на значении, переданном переменной «type» в области. Поэтому я не могу использовать templateUrl. – Sam

+0

Я отредактировал исходный код согласно вашей рекомендации, спасибо. – Sam

ответ

2

Я думаю, что есть опечатка: ng-repeat вместо data-ng-reapeat и ng-repeat должны быть размещены на <tr>

<table> 
<thead> 
    <tr> 
     <th>File</th>   
    </tr> 
</thead> 
<tbody> 
    <tr ng-repeat="src in sources"> 
     <td>{{src.fileName}}</td> 
    </tr> 
</tbody> 

Обратите внимание, что $http.get является ASYN и не забудьте обернуть код внутри scope.$apply. Вы должны изменить свой код следующим образом:

link: function (scope, element, attr) { 
      var template = 'Template_' + scope.type + '.html'; 

      $http.get(template, { cache: $templateCache }).success(function (tplContent) { 
       scope.$apply(function(){ 
       element.replaceWith(tplContent); 
       $compile(element)(scope); 
       //Or 
       //element.html(tplContent); 
       //$compile(element.contents())(scope); 
       }); 
      }); 
     } 
+0

ng-repeat и data-ng-repeat являются взаимозаменяемыми. То же самое касается всех директив, все они могут иметь префиксы для них, даже разработанные на заказ директивы. –

+0

@ francisco.preller: если вы посмотрите внимательно, вы увидите 'reapeat' вместо' repeat' –

+0

О да, вы абсолютно правы. Думал, ты имел в виду последнего. Мой плохой :) –

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