我想使用AngularJS与Django,但他们都使用{{}}作为他们的模板标签。是否有一种简单的方法来更改其中之一,以使用其他自定义模板标签?


当前回答

我投票反对使用双括号(())作为模板标签。只要不涉及函数调用,它就可以很好地工作,但当尝试以下方法时

ng:disabled=(($invalidWidgets.visible()))

在Mac上使用Firefox(10.0.2)时,我得到了一个非常长的错误,而不是预期的逻辑。<[]>对我来说很顺利,至少到目前为止。

编辑2012-03-29: 请注意,$invalidWidgets已弃用。然而,我仍然会使用另一种包装而不是双括号。对于任何高于0.10.7的angular版本(我猜),你可以在应用/模块定义中更容易地更改包装器:

angular.module('YourAppName', [], function ($interpolateProvider) {
    $interpolateProvider.startSymbol('<[');
    $interpolateProvider.endSymbol(']>');
}); 

API文档。

其他回答

如果执行任何服务器端插值,唯一正确的方法是使用<>

$interpolateProvider.startSymbol('<{').endSymbol('}>');

其他任何向量都是XSS向量。

这是因为任何没有被Django转义的Angular分隔符都可以被用户输入到插入的字符串中;如果有人将他们的用户名设置为“{{evil_code}}”,Angular会很乐意运行它。但是,如果您使用的字符没有被Django转义,则不会发生这种情况。

我们在Django 'ng'中创建了一个非常简单的过滤器,可以很容易地混合这两者:

foo.html:

...
<div>
  {{ django_context_var }}
  {{ 'angularScopeVar' | ng }}
  {{ 'angularScopeFunction()' | ng }}
</div>
...

ng过滤器看起来是这样的:

from django import template
from django.utils import safestring

register = template.Library()


@register.filter(name='ng')
def Angularify(value):
  return safestring.mark_safe('{{%s}}' % value)

所以今天我在Angular IRC频道得到了很大的帮助。事实证明,你可以很容易地更改Angular的模板标签。以下必要的代码片段应该包含在你的angular include之后(给定的例子会出现在他们的邮件列表中,并且会使用(())作为新的模板标签,代替你自己的):

angular.markup('(())', function(text, textNode, parentElement){
  if (parentElement[0].nodeName.toLowerCase() == 'script') return;
  text = text.replace(/\(\(/g,'{{').replace(/\)\)/g, '}}');
  textNode.text(text);
  return angular.markup('{{}}').call(this, text, textNode, parentElement);
});

angular.attrMarkup('(())', function(value, name, element){
    value = value.replace(/\(\(/g,'{{').replace(/\)\)/, '}}');
    element[0].setAttribute(name, value);
    return angular.attrMarkup('{{}}').call(this, value, name, element);
});

此外,我还指出了即将进行的增强,它将公开startSymbol和endSymbol属性,可以将它们设置为您想要的任何标记。

你可以试试逐字逐句的Django模板标签 像这样使用它:

< script src = " https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js " > < /脚本> {% verbatim %} < div ng-app = " " > <p>10是{{5 + 5}}</p> < / div > {% endverbatim %}

我投票反对使用双括号(())作为模板标签。只要不涉及函数调用,它就可以很好地工作,但当尝试以下方法时

ng:disabled=(($invalidWidgets.visible()))

在Mac上使用Firefox(10.0.2)时,我得到了一个非常长的错误,而不是预期的逻辑。<[]>对我来说很顺利,至少到目前为止。

编辑2012-03-29: 请注意,$invalidWidgets已弃用。然而,我仍然会使用另一种包装而不是双括号。对于任何高于0.10.7的angular版本(我猜),你可以在应用/模块定义中更容易地更改包装器:

angular.module('YourAppName', [], function ($interpolateProvider) {
    $interpolateProvider.startSymbol('<[');
    $interpolateProvider.endSymbol(']>');
}); 

API文档。