javascript - with - set page title in angular 6




AngularJS com Django-tags de template conflitantes (9)

Achei o código abaixo útil. Eu encontrei o código aqui: 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)

Eu quero usar o AngularJS com o Django, mas ambos usam {{ }} como suas tags de template. Existe uma maneira fácil de alterar um dos dois para usar outra marca de modelo personalizada?


Então eu tenho uma grande ajuda no canal Angular IRC hoje. Acontece que você pode mudar as tags de template do Angular com muita facilidade. Os trechos necessários abaixo devem ser incluídos após sua inclusão angular (o exemplo fornecido aparece em suas listas de discussão e usaria (()) como as novas tags de modelo, substituindo as suas próprias):

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);
});

Além disso, fui apontado para um aprimoramento futuro que exporá as propriedades endSymbol e endSymbol que podem ser definidas para qualquer tag desejada.


Eu voto contra o uso de parênteses duplos (()) como tag de modelo. Pode funcionar bem, desde que nenhuma chamada de função esteja envolvida, mas quando experimentada a seguinte

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

Com o Firefox (10.0.2) no Mac eu tenho um erro muito longo em vez da lógica pretendida. <[]> correu bem para mim, pelo menos até agora.

Edit 2012-03-29: Por favor, note que $ invalidWidgets é obsoleto. No entanto, eu ainda usaria outro invólucro do que chaves duplas. Para qualquer versão angular maior que 0.10.7 (eu acho) você poderia alterar o wrapper muito mais facilmente em sua definição de aplicativo / módulo:

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

Documentos de API .


Nós criamos um filtro muito simples no Django 'ng' que facilita mixar os dois:

foo.html:

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

O filtro ng parece com isto:

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)

Para o AngularJS v1.3.3 você deve definir suas próprias tags de template como esta

Módulo AngularJS

angular.module('myapp', []).config(function($interpolateProvider) {
    $interpolateProvider.startSymbol('{$');
    $interpolateProvider.endSymbol('$}');
});

Página da web

<a>{$ variable $}</a> 

Se você fizer qualquer interpolação do lado do servidor, a única maneira correta de fazer isso é com <>

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

Qualquer outra coisa é um vetor XSS.

Isso ocorre porque quaisquer delimitadores angulares que não sejam escapados pelo Django podem ser inseridos pelo usuário na string interpolada; se alguém definir seu nome de usuário como "{{evil_code}}", o Angular ficará feliz em executá-lo . Se você usar um personagem que o Django escapa , no entanto, isso não acontecerá.


Se você usa o django 1.5 e o uso mais recente:

  {% verbatim %}
    {{if dying}}Still alive.{{/if}}
  {% endverbatim %}

Se você está preso com o django 1.2 no appengine, estenda a sintaxe do django com o comando verbatim template como este ...

from django import template

register = template.Library()

class VerbatimNode(template.Node):

    def __init__(self, text):
        self.text = text

    def render(self, context):
        return self.text

@register.tag
def verbatim(parser, token):
    text = []
    while 1:
        token = parser.tokens.pop(0)
        if token.contents == 'endverbatim':
            break
        if token.token_type == template.TOKEN_VAR:
            text.append('{{')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('{%')
        text.append(token.contents)
        if token.token_type == template.TOKEN_VAR:
            text.append('}}')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('%}')
    return VerbatimNode(''.join(text))

Em seu arquivo use:

from google.appengine.ext.webapp import template
template.register_template_library('utilities.verbatim_template_tag')

Fonte: http://bamboobig.blogspot.co.at/2011/09/notebook-using-jquery-templates-in.html


Você pode dizer ao Django para gerar {{ e }} , bem como outras strings de template reservadas usando a tag {% templatetag %} .

Por exemplo, usar {% templatetag openvariable %} produziria {{ .


talvez você possa tentar verbatim Django template tag e usá-lo assim:

<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 %}





angularjs