Я попытался написать небольшую директиву, чтобы обернуть ее содержимое другим файлом шаблона.Директива AngularJS не обновляет изменения переменных области
Этот код:
<layout name="Default">My cool content</layout>
Должен иметь этот выход:
<div class="layoutDefault">My cool content</div>
Поскольку раскладка "по умолчанию" имеет следующий код:
<div class="layoutDefault">{{content}}</div>
Здесь код директивы:
app.directive('layout', function($http, $compile){
return {
restrict: 'E',
link: function(scope, element, attributes) {
var layoutName = (angular.isDefined(attributes.name)) ? attributes.name : 'Default';
$http.get(scope.constants.pathLayouts + layoutName + '.html')
.success(function(layout){
var regexp = /^([\s\S]*?){{content}}([\s\S]*)$/g;
var result = regexp.exec(layout);
var templateWithLayout = result[1] + element.html() + result[2];
element.html($compile(templateWithLayout)(scope));
});
}
}
});
Моя проблема:
Когда я использую области видимости переменных в шаблоне (в шаблоне макета или внутри макета тега), например. {{whatever}}
он просто работает изначально. Если я обновляю переменную whatever
, директива больше не обновляется. Вся функция соединения будет только активирована один раз.
Я думаю, что AngularJS не знает, что эта директива использует переменные области видимости и поэтому не обновляется. Но я не знаю, как исправить это поведение.
Ни один из нынешних ответов не кажется, для решения вопроса о том, почему (при использовании '$ compile') часы не автоматически устанавливается. Как вы говорите, он связан сначала ... –
Я нашел другое решение, чтобы использовать шаблон и ng-transclude. Это хорошо работает - всегда. Единственная проблема заключается в том, что я не знаю, как настроить сам шаблон макета. Если я использую ng-include с функцией scope для получения пути к шаблону, я получаю ошибку ngTransclude: orphan. – Armin
Хорошо, я нашел решение для изменения templateUrl динамически. См. Мой собственный ответ ниже. – Armin