Подтвердить что ты не робот

Как установить собственный атрибут из директивы AngularJS?

Я бы хотел написать HTML, похожий на:

<a href="sharedasset: img.png">test</a>
<img src="sharedasset: img.png"/>

И иметь директиву, называемую "sharedasset", которая получает полный путь к img.png и устанавливает значение атрибута без указания какой-либо информации о том, какое имя атрибута опережает время. Возможно ли это?

Обновление

Поскольку я изначально опубликовал это, были некоторые улучшения в Angular, и я подумал, что в результате я поделюсь тем, что я делаю сейчас. В HTML я использую ответ Guido Bouman, который должен создать фильтр, и теперь с функцией Angular bind once, это делает его лучшим вариантом, на мой взгляд.

Однако в JS-коде вместо ввода константы $filter и my globalVars во всем мире теперь я просто добавляю слово static к любому пути ресурса, размещенного на сервере статического контента, например {templateUrl: "static/someTemplate.html"} а затем используйте HTTP-перехватчик Angular для поиска любого пути, который начинается со "статического" и заменяет его доменом для статического сервера. Очень просто.

4b9b3361

Ответ 1

<a full-path="img.png">test</a>
<img full-path="img.png">

app.directive('fullPath', function() {
    return {
        link: function(scope, element, attrs) {
            var fullPathUrl = "http://.../";
            if(element[0].tagName === "A") {
                attrs.$set('href',fullPathUrl + attrs.fullPath);
            } else {
                attrs.$set('src',fullPathUrl + attrs.fullPath);
            }
        },
    }
});

Я не знаю, откуда вы получаете fullPathUrl, поэтому я жестко запрограммировал его в функции ссылок.

Ответ 2

Я не хотел, чтобы директива заботилась о том, что такое имя атрибута, так вот что я в итоге сделал:

<a shared-asset="images/img.png" attr="href">test</a>
<img shared-asset="images/img.png" />

app.directive('sharedAsset', function (globalVars) {
    return {
        restrict: "A",
        scope: {
            attr: "@attr"
        },
        link: function (scope, element, attrs) {
            var fullPath = globalVars.staticWebsite + "/app/styles/main/" + attrs.sharedAsset + "?build=" + globalVars.buildNumber;

            attrs.$set(scope.attr || "src", fullPath);
        }
    };
});

Обновление. Я поменял его по умолчанию на атрибут "src", поскольку изображения будут наиболее распространенным сценарием.

Ответ 3

Пользовательский фильтр гораздо более подходит для этого случая, чем директива:

<a href="{{'images/img.png' | fullPath}}">test</a>
<img src="{{'images/img.png' | fullPath}}" />

Фильтр: (Предполагая, что у вас есть глобальный модуль filters)

angular.module('filters').filter('fullPath', function(globalVars) {
  return function(url) {
    return globalVars.staticWebsite + "/app/styles/main/" + url + "?build=" + globalVars.buildNumber;
  };
});