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

Бих искал да напиша HTML, подобен на:

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

И имайте директива, наречена "sharedasset", която получава пълния път до img.png и задава стойността на атрибута, без директивата да знае какво е името на атрибута преди време. Това възможно ли е?

Актуализация

Откакто първоначално публикувах това, имаше някои подобрения в Angular и реших да споделя какво правя сега като резултат. В HTML използвам отговора на Guido Bouman, който е да създам филтър и сега с функцията свързване веднъж на Angular, това го прави най-добрият вариант според мен.

В JS кода обаче, вместо да инжектирам $filter и моята globalVars константа навсякъде, сега просто добавям думата static към всеки път на актив, който се хоства на сървъра за статично съдържание като {templateUrl: "static/someTemplate.html"} и след това използвам Angular HTTP Interceptor, за да търся всякакви път, който започва със "статичен" и го заменете с домейна за статичния сървър. Много просто.


person adam0101    schedule 13.08.2013    source източник
comment
Какво ще кажете за <a ng-href="{{fullPath}}img.png"> и <img ng-src="{{fullPath}}img.png">? Това ще изисква fullPath да бъде дефинирано в контролер.   -  person Mark Rajcok    schedule 14.08.2013
comment
Все пак искам fullPath да бъде дефиниран в директивата.   -  person adam0101    schedule 14.08.2013
comment
Директивата не може да се използва в стойността на href или src.   -  person Mark Rajcok    schedule 14.08.2013
comment
Но на docs.angularjs.org/guide/directive в горната част те имат примера <span class="my-dir: exp;"></span>. Как го правят?   -  person adam0101    schedule 14.08.2013
comment
Може да се използва като клас.   -  person Mark Rajcok    schedule 14.08.2013


Отговори (3)


Не исках директивата да се интересува какво е името на атрибута, така че в крайна сметка направих това:

<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);
        }
    };
});

Update: I changed it to default to the "src" attribute since images will be the most common scenario.

person adam0101    schedule 13.08.2013
comment
Така че правите практически същото като Марк, но маркирате собствения си отговор като отговор. Много добре. - person Blackunknown; 30.09.2014
comment
@Blackunknown, защото отговорът му не отговори на моя въпрос. Конкретно заявих, че името на атрибута не може да бъде известно предварително, но той го е кодирал твърдо. Подкрепих отговора му, защото помогна, но маркирах моя като отговор, защото отговаряше на въпроса ми. - person adam0101; 30.09.2014
comment
Според мен той все пак ти даде отговора. Всичко, което направихте, беше да добавите променлива, вместо да бъде твърдо кодирана. Много от отговорите, които хората дават тук, в крайна сметка няма да бъдат 100% това, което искате. Освен това разликата е толкова минимална. - person Blackunknown; 01.10.2014
comment
Каквото и да е, за мен няма значение. Просто реших, че следващият посетител ще иска да види отговора, който отговаря най-добре на въпроса. - person adam0101; 01.10.2014

Персонализираният филтър е много по-подходящ за този случай от директивата:

<a href="/bg{{'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;
  };
});
person Guido Bouman    schedule 08.12.2014
comment
Много ми харесва този подход. Вероятно ще го направя по този начин в следващия си проект. Предполагам, че ако трябва да го направите програмно, можете да използвате $filter('fullPath')('images/img.png') тогава? - person adam0101; 13.03.2015
comment
Да, това също е предимство. - person Guido Bouman; 13.03.2015

person    schedule
comment
Това е близо, но има 'href' твърдо кодирано в директивата. Какво ще стане, ако искам да използвам директивата на <img src=""? - person adam0101; 14.08.2013
comment
@adam0101, дефинирайте друга директива или направете директивата one по-интелигентна, за да проверите типа етикет: if(element[0].tagName === "A") { ... } else { ... }. - person Mark Rajcok; 14.08.2013