2013-08-21 20 views
6

Mam problem z dyrektywą iframe, którą próbuję zaimplementować.Angular: błąd atrybutu src w dyrektywie Iframe

Jak daleko jestem: Szablon:

<div class="externalIframe" iframe-src="external.html"></div> 

dyrektywa:

angular.module('project.directives', []) 
    .directive('externalIframe', ['$rootScope', function($rootScope) { 
     return { 
     restrict: 'C', 
     replace: true, 
     transclude: true, 
     scope: { 
      src: '@iframeSrc', // the src uses the data-binding from the parent scope 
     }, 
     template: '<iframe src="{{src}}" height="100%" width="100%" frameborder="0"></iframe>', 
     link: function(scope, elem, attrs) { 
      //elem.src = "dummy.html"; // not working either 
     } 
     } 
    }]) 

Problem: Strzela 2 żądania HTTP (2 iframe ładowanie). :

  • jeden do http://localhost:8000/app/{{src}} (iframe src jeszcze interpreated przez kanciasty)
  • jeden do http://localhost:8000/app/external.html (iframe src raz interpreated przez kanciasty)

Chcę uniknąć niepotrzebnego pierwsze połączenie .. Jak czy mogę to zrobić ?

Próbowałem bez src w szablonie i programowo ustawiłem go w funkcji łącza lub kompilacji, ale to nie uruchamia ładowania elementu iframe.

edit: jsFiddle dodany do demo błędów metodą kompilacji => zobaczysz na karcie sieciowej Firebug/Chrome panelu dev że dwa żądania są wykonane:

  • http://fiddle.jshell.net/_display/%7B%7Bsrc%7D%7D
  • http://fiddle.jshell.net/_display/external.html

Dzięki za pomoc

Odpowiedz

8

Nie potrzebujesz do tego dyrektywy. Użyj ng-src na rzeczywistym elemencie iframe. Zobacz docs on ng-src.

<iframe ng-src="external.html"></iframe> 
+0

Oczywiście, możesz to zrobić, ale to nie rozwiązało wspomnianego problemu –

+0

Czy możesz mi wyjaśnić: co przegapiłem? Jeśli chcesz mieć dyrektywę z ramką iframe, nadal możesz używać ng-src? – markmarijnissen

+0

Używanie ng-src działało jak czar i sprawiło, że dwa błędy HTTP od początku zniknęły. Myślę, że odpowiedź idealnie odpowiada pytanie: –

1

Zamiast używać "łącza", użyj funkcji "kompilacji", ponieważ zasadniczo chcesz zmodyfikować kod HTML przed wstawieniem go do DOM. Myślę, że "link" jest wstawiany, a następnie związany z zakresem.

Więc z linkiem 1. kompilacji jest wywoływana z {{url}} - wniosek iframe jest wykonany 2. Link nazywa i {{url}} jest wymieniane, stąd ty drugie połączenie.

Jeśli używasz "kompilacji", możesz samodzielnie zmodyfikować atrybut src.

Daj http://docs.angularjs.org/guide/directive spojrzeć na nadzieję, że to pomaga

Edycja Sprawdź to skrzypce http://jsfiddle.net/jbSx6/20/

return { 
    restrict: 'E', 
    require: '?ngModel', 
    replace: true, 
    transclude: true, 
    template: '<iframe src="%url%" height="100%" width="100%" frameborder="0"></iframe>', 
    compile: function (element, attrs, transclude) { 
     console.log(element[0].outerHTML); 
     element[0].outerHTML = element[0].outerHTML.replace('%url%',attrs.iframeSrc); 
     console.log(element); 
    } 
}; 

<div ng-app="myApp"> 
    <div>display google in frame</div> 
    <my-frame data-iframe-src="http://jsfiddle.net">test</my-frame> 
</div> 
+0

Dziękuję za pomoc, ale spróbowałem bez powodzenia. Zobacz moją edycję/jsfiddle po szczegóły. –

+0

Witaj Bixi - działa, w tym skrzypce wciąż korzystasz z funkcji łączenia, a nie kompilacji. Zobacz moją edycję. – leon

+0

To zdecydowanie "kątowa metoda" rozwiązania problemu. Dobra odpowiedź. –

5

Usuwanie SRC z iframe w szablonie i po prostu zmieniając atrybut w funkcji Link (via element.attr()) działa:

return { 
    restrict: 'E', 
    require: '?ngModel', 
    replace: true, 
    transclude: true, 
    template: '<iframe height="100%" width="100%" frameborder="0"></iframe>', 
    link: function (scope, element, attrs) { 
     element.attr('src', attrs.iframeSrc); 
    } 
}; 

Fiddle: http://jsfiddle.net/5rYrw/

+0

Dziękuję za to, część 'element.attr (' była przydatna, –

Powiązane problemy