2015-08-25 6 views
0

Я вставляю src атлет для <iframe> с помощью AngularJS.Контроллер, возвращающий значение несколько раз

По какой-то причине, всякий раз, когда я называю захватом этого значения, он возвращается несколько раз. Я знаю это, потому что я проверял использование console.log(src) для отладки, прежде чем я получил решение.

Этот незначительный глюк, похоже, не вызывает никаких ошибок (или замедляет мое приложение), но мне любопытно узнать, что происходит?


Update

Я уменьшил код в моем контроллере, перемещая большую часть работы моей службы пользовательских recentStations (доступно в случае необходимости).

Результат в виде HTML все тот же, что и поведение при возврате нескольких результатов.


Контроллер

app.controller('contentCtrl', ['$scope', 'recentStations', function($scope, recentStations){ 

    $scope.getCurrentSrc = function(){ 
     return recentStations.getCurrentSrc(); 
    }; 

}]); 

HTML

<div id="content" data-ng-controller="contentCtrl"> 
    <iframe data-ng-src="{{ getCurrentSrc() }}" seamless></iframe> 
</div> 
+0

$ sce может вызвать это. Что происходит внутри trustAsResourceUrl? – schlingel

+0

Похоже, что запутанным является то, что 'scope.getCurrentSrc' вызывается несколько раз. Я ожидаю, что он будет вызываться один раз за цикл '$ digest', который будет несколько раз при загрузке, плюс снова каждый раз, когда Angular решит, что произошло что-то интересное. – DRobinson

+1

Вы можете получить подсказку http://stackoverflow.com/questions/14973792/why-angularjs-will-invoke-function-name-twice – Vineet

ответ

1

Потенциальный способ работы с дополнительными вызовами функций - это привязка к простому значению в вашем случае src и использование $watch для зависимых значений для его перестройки.

Вот пример для контроллера:

$scope.$watch(getLink, buildSource); 

function getLink(){ 
    return recentStations.getCurrent().link; 
} 

function buildSource(link){ 
    var url = 'http://iris2.rail.co.uk/tiger/'; 
    var src = url + link; 

    $scope.src = $sce.trustAsResourceUrl(src); 
}; 

HTML-бы связать следующим образом:

<iframe data-ng-src="{{ src }}" seamless></iframe> 

Однако, вы все еще делаете (меньший) вызов функции каждые $ переваривать; теперь это функция getLink, вызываемая каждый раз. Это связано с тем, что вам нужно позвонить recentStations.getCurrent(), чтобы получить ссылку. Если есть способ привязать его значение к src, его можно просто проверить каждый цикл $ digest.

+0

Спасибо, это очень полезно. Мне пришлось внести поправки для моего использования, так как я немного изменил свои требования, но ваш ответ отлично работает для моего первоначального вопроса. –

0

Такое поведение вызвано angularjs грязной проверки. AngularJS реализует грязную проверку двусторонней привязки данных.

+0

Спасибо. Любые предложения относительно того, как я могу избежать такого поведения? Обратите внимание, что я обновил код в своем вопросе. –

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