Korzystając z Angular i Phonegap, próbuję załadować wideo, które znajduje się na zdalnym serwerze, ale napotkałem problem. W moim JSON adres URL jest wprowadzany jako zwykły adres URL HTTP.
"src" : "http://www.somesite.com/myvideo.mp4"
Mój szablon wideo
<video controls poster="img/poster.png">
<source ng-src="{{object.src}}" type="video/mp4"/>
</video>
Wszystkie inne dane są ładowane, ale gdy patrzę na konsolę, pojawia się następujący błąd:
Error: [$interpolate:interr] Can't interpolate: {{object.src}}
Error: [$sce:insecurl] Blocked loading resource from url not allowed by $sceDelegate policy. URL
Próbowałem dodać $compileProvider
w konfiguracji, ale to nie rozwiązało mojego problemu.
$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);
Widziałem ten post o problemach między domenami, ale nie jestem pewien, jak rozwiązać ten problem ani w jakim kierunku powinienem iść. Jakieś pomysły? Każda pomoc jest mile widziana
javascript
angularjs
cordova
mhartington
źródło
źródło
config.xml
plik swojej corodvy ?Odpowiedzi:
To jedyne rozwiązanie, które działało dla mnie:
Następnie w ramce iframe:
http://plnkr.co/edit/tYq22VjwB10WmytQO9Pb?p=preview
źródło
Innym prostym rozwiązaniem jest utworzenie filtra:
Następnie określ filtr w
ng-src
:źródło
Dodaj zasoby do białej listy za pomocą $ sceDelegateProvider
Jest to spowodowane nową polityką bezpieczeństwa wprowadzoną w Angular 1.2. Utrudnia to działanie XSS, uniemożliwiając hakerowi wybieranie numeru (tj. Wysłanie żądania na obcy adres URL, potencjalnie zawierający ładunek).
Aby obejść to poprawnie, musisz dodać do białej listy domen, na które chcesz zezwolić, w następujący sposób:
Ten przykład pochodzi z dokumentacji, którą możesz przeczytać tutaj:
https://docs.angularjs.org/api/ng/provider/$sceDelegateProvider
Pamiętaj, aby dołączyć ngSanitize do swojej aplikacji, aby to działało.
Wyłączanie funkcji
Jeśli chcesz wyłączyć tę przydatną funkcję i masz pewność, że Twoje dane są bezpieczne, możesz po prostu pozwolić **, na przykład:
źródło
resourceUrlWhitelist
jakoś nie działa, sprawdź, czy nie masz podwójnego ukośnika po nazwie domeny (łatwo to zrobić,Miałem ten sam problem tutaj. Musiałem powiązać linki do YouTube. Jako globalne rozwiązanie zadziałało dodanie do mojej konfiguracji następujących elementów:
Dodanie „self” jest tam ważne - w przeciwnym razie nie uda się powiązać z żadnym adresem URL. Z kątowych dokumentów
Dzięki temu mogę teraz łączyć się bezpośrednio z dowolnym linkiem do YouTube.
Oczywiście będziesz musiał dostosować regex do swoich potrzeb. Mam nadzieję, że to pomoże!
źródło
Najlepszym i łatwym rozwiązaniem tego problemu jest przekazanie danych z tej funkcji do kontrolera.
Na stronie HTML
źródło
Ten sam problem napotkałem za pomocą Videogular. Podczas używania ng-src otrzymywałem następujące informacje:
Rozwiązałem problem, pisząc podstawową dyrektywę:
HTML:
źródło
Jeśli ktoś szuka rozwiązania TypeScript:
plik .ts (w razie potrzeby zmień zmienne):
HTML:
źródło
Na podstawie komunikatu o błędzie twój problem wydaje się być związany z interpolacją (zazwyczaj z twoim wyrażeniem
{{}}
), a nie z problemem między domenami. Zasadniczong-src="{{object.src}}"
jest do bani.ng-src
został zaprojektowany z myślą oimg
tagach IMO. Może to nie być odpowiednie<source>
. Zobacz http://docs.angularjs.org/api/ng.directive:ngSrcJeśli zadeklarujesz
<source src="somesite.com/myvideo.mp4"; type="video/mp4"/>
, będzie działać, prawda? (zwróć uwagę, że usuwamng-src
na korzyśćsrc
). Jeśli nie, najpierw trzeba to naprawić.Następnie upewnij się, że
{{object.src}}
zwraca wartość oczekiwaną ( na zewnątrz od<video>
):Jeśli zwraca oczekiwaną wartość, powinna działać następująca instrukcja:
źródło
ng-src
byciem zepsutym (nie jest zepsute). Ma to związek z polityką bezpieczeństwa AngularJS: docs.quarejs.org/api/ng/service/$sceMiałem ten błąd w testach , dyrektywa
templateUrl
nie była zaufana, ale tylko dla specyfikacji, więc dodałem katalog szablonów:Mój główny katalog to
app
.źródło