Как использовать ng-href с абсолютным URL-адресом?
Я все еще новичок в angularjs, и у меня есть проблема, по которой я, похоже, не могу найти решение, и у меня нет времени, чтобы заглянуть в источник angular.
Это мой сценарий:
У меня есть некоторые данные json с набором URL-адресов, которые я хочу показать на экране.
У меня есть элемент с ng-repeat="link in links"
и внутри я
<a ng-href="{{link.url}}">{{link.title}}</a>
Это работает, но все ссылки указывают на mydomain/apppath/valueoflink.title
Я хочу, чтобы они были абсолютными, только valueoflink.title без префикса.
Как сообщить angular, что это абсолютный не относительный URL?
Ответы
Ответ 1
Я решил это, префиксные данные в json с помощью "http://", чтобы сделать их trully абсолютными URL-адресами, и угловое отношение к этому.
Тогда я понял, что angular на самом деле ничего не делает со значением, он просто помещает его туда, как есть, и я виноват в этом.
обновление кода для этого решает проблему, когда все URL-адреса похожи на "www.google.com"
<a ng-href="http://{{link.url}}">{{link.title}}</a>
Обычная старая проблема "проверить элемент", и я проигнорировал тот факт, что ng-href связывается с синтаксисом {{value}}, поэтому вот почему моя первая попытка поместить ng-href="'http://'+{{value}}"
не удалась и заставила меня преждевременно задавать вопрос, но я не уверен, что я должен удалить его, поскольку я могу не только сделать такую ошибку.
Ответ 2
Как сказал Горан, его решение будет работать, только если все URL-адреса похожи на "www.google.com".
Если у вас есть комбинация разных типов URL-адресов, e.x. 'www.google.com', 'https://github.com', 'http://goo.gl', 'github.com ', вы можете использовать ng-href с фильтром angular:
<a ng-href="{{link.url|myFilter}}">{{link.title}}</a>
и фильтр, который добавит "http://" к вашему URL-адресу, если он начинается с "www":
'use strict';
myApp.filter("myFilter", function () {
return function (link) {
var result;
var startingUrl = "http://";
var httpsStartingUrl = "https://";
if(link.startWith(startingUrl)||link.startWith(httpsStartingUrl)){
result = link;
}
else {
result = startingUrl + link;
}
return result;
}
});
String.prototype.startWith = function (str) {
return this.indexOf(str) == 0;
};
Ответ 3
Для использования внешнего URL фильтр слишком сложный. Ниже приведен фрагмент, используемый на моем веб-сайте, youtiming.com, для доступа к Yahoo! Новости финансов на тикер, такой как AMZN, хранящийся в файле ticker.tick.name. "тикер" - это переменная цикла из ng-repeat, "ng-repeat =" тикер в portf.tickers ".
<div ng-if="ticker.tick.name">
<a href="#" onclick="location.href='http://finance.yahoo.com/quote/{{::ticker.tick.name}}/news?p={{::ticker.tick.name}}'; return false;">{{::ticker.tick.name}} News from Yahoo! Finance</a>
</div>
В соответствии с документом ng-href (https://docs.angularjs.org/api/ng/directive/ngHref), причина использования ng-href: "Использование разметки Angular {{hash}} в атрибуте href приведет к тому, что ссылка перейдет к неправильному URL-адресу, если пользователь нажмет на нее до того, как Angular сможет заменить {{hash}} разметку своим значением.", поэтому, чтобы остановить побочный эффект при отключении двухсторонней привязки данных по значению "::" по соображениям производительности, вы сначала ng - если доступно ticker.tick.name: если да, создайте URL-адрес; в противном случае код будет удерживаться, пока он не станет доступным.
Если время для добавления ticker.tick.name становится заметным, вы должны проверить отставание или сетевой трафик службы RESTful, а не пытаться предоставить комплексное решение из front-end.