更新1.2.8时的Angular $ parse错误

时间:2014-01-17 10:38:29

标签: angularjs angularjs-directive flash

我正在尝试在我的一个项目中将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,请告诉我:)

1 个答案:

答案 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