我正在尝试在我的一个项目中将Angular 1.0.8更新为1.2.8。 除了一件事,一切都好。
这是错误:
Error: [$parse:syntax] Syntax Error: Token 'undefined' expected : at column null of the expression [//my.url.com/some/path/mySwf.swf?someParam=en
这是我的DOM:
<embed data-embed-src embed-src="{{simulatorUrl}}" type="application/x-shockwave-flash" width="100%" height="450" allowscriptaccess="always"
wmode="transparent" quality="high" swliveconnect="true" name="Simulator" id="Simulator"
flashvars="">
因为ngSrc不起作用,我使用指令来监视src属性:
angular.module('myApp')
.directive('embedSrc', function () {
return {
restrict: 'A',
link: function postLink(scope, element, attrs) {
var current = element;
scope.$watch(attrs.embedSrc, function () {
var clone = element
.clone()
.attr('src', attrs.embedSrc);
current.replaceWith(clone);
current = clone;
});
}
};
});
我尝试了一些没有成功的事情:
首先,改变消毒:$compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);
禁用$sceProvider
尝试将我的网址放入$sce
受信任的ressourceUrl
尝试使用'http:'
如果我的网址看起来像:'www.myurl.com/mySwf.swf'它可以工作,但遗憾的是没有params。
要测试,如果我将网址表达式{{simulatorUrl}}
放在ng-href
:
<a ng-href="{{simulatorUrl}}">Salut</a>
它就像一个魅力。 $ parse不会抛出错误。
我认为这是因为我的指示或$sce
,但我不确定。
如果有人已经使用角度1.2.8嵌入swf,请告诉我:)
答案 0 :(得分:2)
embed-src={{...}}
是一个插值表达式。在执行post-link函数时,必须处理Angular中的插值表达式,因此attrs.embedSrc
基本上是一个内容为{{...}}
的字符串。
因此,调用scope.$watch(attrs.embedSrc,...)
等同于调用`scope。$ watch('{{..}}',...)导致错误。
对于观察插值属性(或一般属性),应使用属性' $observe(key, fn)
方法:
$ observe(key,fn)
观察插值属性。
在编译后的下一个$ digest期间,将调用一次观察者函数。只要内插值发生变化,就会调用观察者。
因此,您应该使用:attrs.$observe('embedSrc',...)
有关更详细的说明,请查看 this answer 。