Задать вопрос
@Glimor
develop

Как в templateUrl директивы передать параметр?

Добрый день.
Кто нибудь знает, как передать в templateUrl значение переменной?
Кусок директивы:
return {
			restrict: 'A',
			scope: {
				message: '=mainMessage',
				typeMessage: '=typeMessage'
			},
			templateUrl:  function(elem, attrs) {
				return 'template/common/' + attrs.typeMessage + '-message.tpl.html';
			},
			link: function(scope, element, attrs) {
			}


кусок html с вызовом директивы:
<div class="mess" main-message="message" type-message="message.type" 
      ng-repeat="message in messages track by message.id">
</div>

Сейчас attrs.typeMessage возвращает message.type, как текст. А должен возвращать заданный тип, например "general".
  • Вопрос задан
  • 598 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
в вашем случае только ng-include. Переменная должна быть интерполирована до вызова compile директивы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Glimor Автор вопроса
develop
Спасибо, воспользовался советом Сергея Протько и сделал так.
Кусок директивы,
return {
			template: '<ng-include src="getTemplateUrl()"/>',
			scope: {
				message: '=mainMessage',
				typeMessage: '=typeMessage'
			},
			restrict: 'A',
			controller: function($scope) {
				$scope.getTemplateUrl = function() {
					return 'template/common/' + $scope.typeMessage + "-message.tpl.html";
				}
			},
			link: function(scope, element, attrs) {
			}
		}

Может кому-то пригодится. Пол дня чехлов собирал)
Ответ написан
AlexXYZ
@AlexXYZ
O Keep Clear O
Как раз недавно делал.
Вызов функции в templateUrl несколько вводит в заблуждение, т.к. эту функцию вы не сможете вызвать и соответственно вызвать её с какими-либо нужными для вас параметрами. Поэтому создание динамичной формы для директивы в зависимости от внешних параметров надо делать в link:

// тут можете сгенерировать любой вид директивы:
function getForm( obj, настройки){
     str = '<a title="открыть в новом окне" ng-href="contragents.admin.html#нси_ключ={{obj._source.нси_ключ}}" target="_blank" ng-show="obj._source._$editor_props.menu_type==1" class="btn btn-xs btn-primary"><span ng-show="obj._source._$editor_props.bool_change==true" class="glyphicon glyphicon-asterisk" style="color:rgb(255, 183, 100)"></span> <u>'+obj._index+'-'+obj._type+'</u> <sup><i class="fa fa-external-link"></i></sup> </a>';
    return str;
}

return {
    scope: { ... },
    // templateUrl: - убираем вообще
    link: function(scope, element, attrs) {
          var str_template = getForm(scope.obj, scope.настройки );
         // надеюсь это не сложно:
          var dom_node = $compile(str_template)(scope); 
          element.append(dom_node);
    }
};
Ответ написан
@Sava-s
Я в своём проекте сделал так:

App.controller('formCtrl', ['$scope', function ($scope) {

    $scope.order = {
        md5hash:"036e4ab264;3253465a34535234524635f353",
        name:'Введите имя',
        phone:'Укажите свой номер',
        email:'Ваш почтовый ящик',
        address:""
    };

}]).directive('formorder', [function() {
    return {
        templateUrl: 'tpl/formOrder.html',
        replace: true,
        scope:{
        },
        link: function ($scope, $element, $attrs){
            $scope.order = $scope.$parent.order;
        }
    }
}]);

прямая связь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы