मैं Django के साथ AngularJS का उपयोग करना चाहता हूं, हालांकि वे दोनों {{ }}
अपने टेम्पलेट टैग के रूप में उपयोग करते हैं। क्या कुछ अन्य कस्टम टेंपलेटिंग टैग का उपयोग करने के लिए दोनों में से एक को बदलने का एक आसान तरीका है?
मैं Django के साथ AngularJS का उपयोग करना चाहता हूं, हालांकि वे दोनों {{ }}
अपने टेम्पलेट टैग के रूप में उपयोग करते हैं। क्या कुछ अन्य कस्टम टेंपलेटिंग टैग का उपयोग करने के लिए दोनों में से एक को बदलने का एक आसान तरीका है?
जवाबों:
कोणीय 1.0 के लिए आपको प्रक्षेप प्रतीकों को कॉन्फ़िगर करने के लिए $ इंटरपोलेटप्रोविडर एपिस का उपयोग करना चाहिए: http://docs.angularjs.org/api/ng.$interpolateProvider ।
कुछ इस तरह करना चाहिए ट्रिक:
myModule.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
दो बातों का ध्यान रखें:
{{ }}
जो उनके टेम्पलेट्स में उपयोग करते हैं तो आपका कॉन्फ़िगरेशन उन्हें तोड़ देगा। ( फिक्स पेंडिंग )जबकि पहले मुद्दे के बारे में हम कुछ नहीं कर सकते हैं, लोगों को चेतावनी देने के अलावा, हमें दूसरे मुद्दे को संबोधित करने की आवश्यकता है।
$interpolateProvider.startSymbol('{[{').endSymbol('}]}');
आप शायद शब्दशः 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 %}
यदि आपने पृष्ठ के अलग-अलग अनुभागों को ठीक से किया है, तो आप आसानी से "कच्चे" टैग दायरे में कोणीयज टैग का उपयोग कर सकते हैं।
जीजा 2 में
{% raw %}
// here you can write angularjs template tags.
{% endraw %}
Django टेम्पलेट में (1.5 से ऊपर)
{% verbatim %}
// here you can write angularjs template tags.
{% endverbatim %}
हमने Django 'एनजी' में एक बहुत ही सरल फिल्टर बनाया है जो दो को मिलाना आसान बनाता है:
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.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
गुण के लिए सेट किया जा सकता है कि जो कुछ भी टैग आप इच्छा।
मैं टेम्पलेट टैग के रूप में डबल कोष्ठक () का उपयोग करने के खिलाफ वोट देता हूं। यह अच्छी तरह से तब तक काम कर सकता है जब तक कोई फ़ंक्शन कॉल शामिल नहीं होता है लेकिन जब निम्नलिखित की कोशिश की जाती है
ng:disabled=(($invalidWidgets.visible()))
मैक पर फ़ायरफ़ॉक्स (10.0.2) के साथ मुझे इच्छित तर्क के बजाय बहुत लंबी त्रुटि मिली। <[]> मेरे लिए अच्छी तरह से चला गया, कम से कम अब तक।
2012-03-29 को संपादित करें: कृपया ध्यान दें कि $ अमान्य वादे हटाए गए हैं। हालांकि मैं अभी भी डबल ब्रेसेस की तुलना में एक और आवरण का उपयोग करूंगा। 0.10.7 से अधिक किसी भी कोणीय संस्करण के लिए (मुझे लगता है) आप अपने ऐप / मॉड्यूल परिभाषा में रैपर को बहुत आसान बदल सकते हैं:
angular.module('YourAppName', [], function ($interpolateProvider) {
$interpolateProvider.startSymbol('<[');
$interpolateProvider.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}}
- हां घुंघराले ब्रेसिज़ के साथ! यह $ गुंजाइश के मूल्य को प्रस्तुत नहीं करता है। आवंटन जो मेरे नियंत्रक में हार्डकोड है। किसी भी विचार मैं क्या याद आ रही है?
आप हमेशा {{}} http://docs.angularjs.org/api/ng/directive/ngBind के बजाय एनजी-बाइंड का उपयोग कर सकते हैं
<span ng-bind="name"></span>
यदि आप django 1.5 और नए प्रयोग करते हैं:
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
यदि आप appjine पर django 1.2 के साथ फंस गए हैं तो इस तरह वर्बटीम टेम्पलेट कमांड के साथ django सिंटैक्स का विस्तार करें ...
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))
आपके फ़ाइल उपयोग में:
from google.appengine.ext.webapp import template
template.register_template_library('utilities.verbatim_template_tag')
स्रोत: http://bamboobig.blogspot.co.at/2011/09/notebook-using-jquery-templates-.html.html
from django import template
to: from google.appengine._internal.django import template
फिर, मेरी मुख्य फ़ाइल में, बस फ़ाइल का नाम बदल दिया: template.register_template_library('utilities.verbatim_template_tag')
आप Django को आउटपुट {{
और }}
, साथ ही अन्य आरक्षित टेम्पलेट स्ट्रिंग्स को {% templatetag %}
टैग का उपयोग करके बता सकते हैं ।
उदाहरण के लिए, {% templatetag openvariable %}
आउटपुट का उपयोग करना {{
।
मैं एक ऐसे समाधान के साथ रहूँगा जो दोनों django टैग {{}} का उपयोग करता है और साथ ही angularjs {{}} या तो एक शब्दशः खंड या templatetag के साथ।
यह केवल इसलिए है क्योंकि आप $ interpolateProvider.startSymbol $ interpolateProvider.endSymbol के माध्यम से angularjs के काम करने (जैसा कि उल्लेख किया गया है) को बदल सकते हैं, लेकिन अगर आप ui-bootstrap जैसे अन्य angularjs का उपयोग करना शुरू करते हैं, तो आप पाएंगे कि कुछ टेम्पलेट ALREADY द्वारा निर्मित हैं। मानक angularjs टैग {{}} के साथ।
उदाहरण के लिए https://github.com/angular-ui/bootstrap/blob/master/template/dialog/message.html देखें ।
यदि आप कोई सर्वर-साइड इंटरपोलेशन करते हैं, तो ऐसा करने का एकमात्र सही तरीका है<>
$interpolateProvider.startSymbol('<{').endSymbol('}>');
कुछ भी एक XSS वेक्टर है।
इसका कारण यह है कि किसी भी कोणीय परिसीमन जो कि Django द्वारा बच नहीं रहे हैं, उपयोगकर्ता द्वारा प्रक्षेपित स्ट्रिंग में प्रवेश किया जा सकता है; यदि कोई अपना उपयोगकर्ता नाम "{{bad_code}}" सेट करता है, तो कोणीय खुशी से इसे चलाएगा । यदि आप Django से बचकर किसी पात्र का उपयोग करते हैं , हालांकि, ऐसा नहीं होगा।
templates
डाइरेक्टरी से एक टेम्प्लेट प्रदान करता हूं , बाकी मैं अंदर डाल देता हूंstatic
। इस तरह से आपके पास हस्तक्षेप नहीं है। वहाँ एक ट्यूटोरियल है जो मैंने यहाँ लिखा है: coderwall.com/p/bzjuka/…