【问题标题】:Angularjs use custom interpolation symbols for scopeAngularjs 使用自定义插值符号作为范围
【发布时间】:2013-11-07 09:36:35
【问题描述】:

我目前有一个 underscore.js 模板,我也想将它与 angular 一起使用,并且仍然能够与下划线一起使用。我想知道是否可以使用指令更改特定范围的插值开始和结束符号,如下所示:

angular.directive('underscoreTemplate', function ($parse, $compile, $interpolateProvider, $interpolate) {
     return {
         restrict: "E",
         replace: false,
         link: function (scope, element, attrs) {
             $interpolateProvider.startSymbol("<%=").endSymbol("%>");
             var parsedExp = $interpolate(element.html());
             // Then replace element contents with interpolated contents
         }
     }
 })

但这会吐出错误

错误:未知提供程序:$interpolateProviderProvider

$interpolateProvider 是否只能用于模块配置?更好的解决方案是简单地使用字符串替换将&lt;%= 更改为{{%&gt; 更改为}}

另外,我注意到element.html() 转义了&lt;%= 中的&lt;%&gt; 中的&gt;。有没有办法防止这种自动转义?

【问题讨论】:

    标签: javascript angularjs underscore.js angularjs-directive


    【解决方案1】:

    好的,您有几个问题,但是我为您找到了解决方案

    演示

    http://jsfiddle.net/colllin/zxwf2/

    问题 1

    您的&amp;lt;&amp;gt; 字符正在转换为&amp;lt;&amp;gt;,因此当您调用element.html() 时,您甚至不会在其中找到&amp;lt;&amp;gt; 的实例字符串。

    问题 2

    由于$interpolate 服务已经由$interpolateProvider“提供”,看来您不能编辑startSymbol 和endSymbol。 但是,您可以在链接函数中将自定义 startSymbol 和 endSymbol 动态转换为角度开始/结束符号。

    解决方案

    myApp.directive('underscoreTemplate', function ($parse, $compile, $interpolate) {
        return {
            restrict: "A",
            link: function(scope, element, attrs) {
                var startSym = $interpolate.startSymbol();
                var endSym = $interpolate.endSymbol();
                var rawExp = element.html();
                var transformedExp = rawExp.replace(/&lt;%=/g, startSym).replace(/&lt;%-/g, startSym).replace(/%&gt;/g, endSym);
                var parsedExp = $interpolate(transformedExp);
    
                scope.$watch(parsedExp, function(newValue) {
                    element.html(newValue);
                });
            }
        }
    });
    

    替代方案

    我不确定如何,但我确信有一种方法可以使用 $interpolateProvider 实例化您自己的自定义 $interpolate 服务(在为下划线标记配置之后)。

    【讨论】:

    • 谢谢,这很好用!我做了一个小改动(使用带有 'g' 的正则表达式)来替换所有实例:jsfiddle.net/e3s5d
    • 很棒的电话。更新了答案。
    • 既然您指出了&lt;%- 语法,我意识到下划线中的默认&lt;%= 更类似于angular 的&lt;div ng-bind-html="myHtml"&gt;&lt;/div&gt;。也许您可以在该指令中添加一些逻辑以允许未转义的 html,方法是将原始表达式中的 '&lt;%=' 替换为 '&lt;div ng-bind-html="',然后将下面的 '%&gt;' 替换为 '"&gt;&lt;/div&gt;'。参考:stackoverflow.com/a/10971756/361609
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2014-04-30
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多