2013-08-21 3 views
6

У меня возникла проблема с директивой Iframe, которую я пытаюсь реализовать.Угловая: ошибка атрибута src в директиве Iframe

Насколько я: Шаблон:

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

Директива:

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

Проблема: выстреливает 2 HTTP запрос (2 IFrame загрузки). :

  • один к http://localhost:8000/app/{{src}} (IFrame ЦСИ еще не interpreated на угловой)
  • один к http://localhost:8000/app/external.html (IFrame ЦСИ раз interpreated угловыми)

Я хочу, чтобы избежать бесполезного первый звонок .. Как Я могу это сделать ?

Я пробовал без src в шаблоне и программно устанавливал его в функции ссылки или компиляции, но это не срабатывало при загрузке iframe.

редактировать: jsFiddle добавлена ​​ошибка демо методом компиляции => вы увидите в вкладке Сеть Firebug/хромированной Dev панели, два запроса сделаны:

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

Спасибо за помощь

ответ

8

Вам не нужна директива для этого. Используйте ng-src на фактическом iframe. См. docs on ng-src.

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

Конечно, вы можете это сделать, но это не решило проблему. –

+0

Можете мне объяснить: что я пропустил? В чем разница? с указанной проблемой? Если вы хотите директиву с iframe, вы все равно можете использовать ng-src? – markmarijnissen

+0

Использование ng-src работало как шарм и заставило две ошибки HTTP с самого начала исчезнуть. Я думаю, что ответ полностью соответствует вопрос –

1

Вместо использования 'link' используйте функцию 'compile', поскольку вы по существу хотите изменить HTML перед вставкой в ​​DOM. Я думаю, что «ссылка» вставлена, а затем привязана к области.

Так со ссылкой 1. компилируемому вызывается с {{URL}} - запрос на IFRAME производится 2. Зацепление называется, и {{URL}} заменяется, следовательно, вы второй вызов.

Если вы используете 'compile', вы можете самостоятельно изменить атрибут src.

Дайте http://docs.angularjs.org/guide/directive взгляд более, надеюсь, что это помогает

Редактировать Проверить эту скрипку 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

привет спасибо за помощь, но я пробовал его без успеха. Для получения подробной информации см. Мое редактирование/jsfiddle. –

+0

Hi Bixi - он работает, в этой скрипке вы все еще используете функцию ссылки, а не компилируете. См. Мое редактирование. – leon

+0

Это определенно «Угловой способ» решения проблемы. Хороший ответ. –

5

Удаление SRC из фрейма в шаблоне и просто изменив атрибут в функции связи (через element.attr()):

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

Спасибо за это, 'element.attr (' part был полезен –

Смежные вопросы