Проще говоря:
> var a = 1
undefined
> a.__proto__
[Number: 0]
> Number.prototype
[Number: 0]
> Number.prototype === a.__proto__
true
Это позволяет вам прикрепить свойства к X.prototype ПОСЛЕ того, как объекты типа X были созданы, и они все равно получат доступ к этим новым свойствам через __proto__ ссылка, которую Javascript-движок использует, чтобы подойти к цепочке прототипов.
Для Angular 1.0 вы должны использовать aps-интерполяциюProvider для настройки интерполяционных символов: http://docs.angularjs.org/api/ng.$interpolateProvider .
Что-то вроде этого должно сделать трюк:
myModule.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
Имейте в виду две вещи:
{{ }}
в своих шаблонах, тогда ваша конфигурация нарушит их. ( исправление ожидает ) Хотя мы ничего не можем сделать по первому вопросу, кроме предупреждения людей, нам нужно решить вторую проблему.
Для AngularJS v1.3.3 вы должны определить свои собственные теги шаблонов, такие как
Модуль AngularJS
angular.module('myapp', []).config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{$');
$interpolateProvider.endSymbol('$}');
});
Веб-страница
<a>{$ variable $}</a>
Если вы выполняете любую интерполяцию на стороне сервера, единственный правильный способ сделать это - <>
$interpolateProvider.startSymbol('<{').endSymbol('}>');
. Все остальное является XSS-вектором.
Это потому что любые угловые разделители, которые не экранируются Django, могут быть введены пользователем в интерполированную строку; если кто-то устанавливает свое имя пользователя как «{{evil_code}}», Угловой будет с радостью запускать его . Однако если вы используете символ , чем escape-файлы Django , это не произойдет.
Итак, сегодня я получил большую помощь в Angular IRC-канале. Оказывается, вы можете легко менять теги шаблона Angular. Необходимые ниже фрагменты должны быть включены после вашего углового включения (данный пример появляется в их списках рассылки и будет использовать (())
в качестве новых тегов шаблона, заменяя ваш собственный):
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
, которые могут быть настроены на любые теги, которые вы хотите.
Я нашел код ниже полезным. Я нашел код здесь: http://djangosnippets.org/snippets/2787/
"""
filename: angularjs.py
Usage:
{% ng Some.angular.scope.content %}
e.g.
{% load angularjs %}
<div ng-init="yourName = 'foobar'">
<p>{% ng yourName %}</p>
</div>
"""
from django import template
register = template.Library()
class AngularJS(template.Node):
def __init__(self, bits):
self.ng = bits
def render(self, ctx):
return "{{%s}}" % " ".join(self.ng[1:])
def do_angular(parser, token):
bits = token.split_contents()
return AngularJS(bits)
register.tag('ng', do_angular)
<p>{% ng location %}</p>
, он будет отображаться как {{location}}
- да с фигурными фигурными скобками! Он не отображает значение $ scope.location, которое жестко закодировано в моем контроллере. Любая идея, что мне не хватает?
– Keshav Agrawal
11 May 2014 в 11:14
Если вы правильно разделили разделы страницы, вы можете легко использовать теги angularjs в области «raw».
В jinja2
{% raw %}
// here you can write angularjs template tags.
{% endraw %}
В шаблоне Django (выше 1.5 )
{% verbatim %}
// here you can write angularjs template tags.
{% endverbatim %}
Вы всегда можете использовать ng-bind вместо {{}} http://docs.angularjs.org/api/ng/directive/ngBind
<span ng-bind="name"></span>
Я бы придерживался решения, которое также использует теги django {{}}, а также angularjs {{}} с дословным разделом или templatetag.
Это просто потому, что вы можете изменить способ работы angularjs (как упоминалось) через $ interpolateProvider.startSymbol $ interpolateProvider.endSymbol, но если вы начнете использовать другие компоненты angularjs, такие как ui-bootstrap, вы обнаружите, что некоторые из шаблонов УЖЕ построены с помощью стандартных меток angularjs {{}}.
Например, посмотрите https://github.com/angular-ui/bootstrap/blob/master/template/dialog/message.html .
вы можете попробовать verbatim шаблон шаблона Django и использовать его следующим образом:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
{% verbatim %}
<div ng-app="">
<p>10 is {{ 5 + 5 }}</p>
</div>
{% endverbatim %}
Вы можете указать Django для вывода {{
и }}
, а также других зарезервированных строк шаблона с помощью тега {% templatetag %}
.
Например, используя {% templatetag openvariable %}
выводит {{
.
Мы создали простой фильтр very в 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)
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
– Mark Rajcok 20 October 2012 в 17:48