javascript - Flask Jinja2 模板语法与 AngularJS 冲突 (jinja2.exceptions.UndefinedError:)
问题描述
如何从 angularjs 访问 html 中的 $scope.list?
jinja2.exceptions.UndefinedError: 'car' 未定义
main.js
(function ()
{
'use strict';
angular.module('WordcountApp', [])
.controller('WordcountController', ['$scope',
function($scope)
{
$scope.some = 'jjj'
console.log( "in WordcountController " , $scope.some)
$scope.cars = [
{make: 'Mazda', model: 'Miata', year: 2001},
{make: 'Toyota', model: 'Prius', year: 2013},
{make: 'Tesla', model: 'S', year: 2015},
{make: 'BMW', model: '325i', year: 2012}
]
}
]
);
}()
);
索引.html
<!DOCTYPE html>
<html ng-app = "WordcountApp" >
<head>
<script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.7.9/angular.min.js"> </script>
<script src = "static/main.js" > </script>
</head>
<body ng-controller = "WordcountController">
<ul ng-repeat = "car in cars" >
<p> {{ car.make }} </p>
</ul>
</body>
</html>
应用程序.py
from flask import Flask
from flask import render_template
from flask import request
app = Flask( __name__ )
displayText = 'Default text from Python'
@app.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')
@app.route("/writeOutput", methods=['POST'])
def writeOutput():
global displayText
print("request.get_json():- ", request.get_json())
displayText = request.get_json()['myOutput']['myText']
print ("from POST " , displayText)
return displayText
@app.route("/displayPreviousText", methods=['GET'])
def displayPreviousText():
global displayText
return displayText
if __name__ == "__main__":
app.run()
我运行这个应用程序python app.py
错误:
jinja2.exceptions.UndefinedError: 'car' is undefined
从角度访问html中的列表的方法是什么?
解决方案
您的错误Error: jinja2.exceptions.UndefinedError: 'car' is undefined
与 JavaScript 无关。问题似乎如下 - Jinja2 模板渲染器也依赖于与 AngularJS 相同的双花括号 {{ your expression here }}
。
有几种解决方案可以用来解决这个问题
您可以更改 Angular 的插值符号,即
angular.module('WordcountApp', []) .config(['$interpolateProvider', function($interpolateProvider) { $interpolateProvider.startSymbol('[['); $interpolateProvider.endSymbol(']]'); }]);
所以你的 javascript/html 代码应该如下所示
(function () { 'use strict'; angular.module('WordcountApp', []) // Setting up new interpolation delimiter which does not conflict with Jinja2 .config(['$interpolateProvider', function($interpolateProvider) { $interpolateProvider.startSymbol('[['); $interpolateProvider.endSymbol(']]'); }]) .controller('WordcountController', ['$scope', function($scope) { $scope.some = 'jjj' console.log( "in WordcountController " , $scope.some) $scope.cars = [ {make: 'Mazda', model: 'Miata', year: 2001}, {make: 'Toyota', model: 'Prius', year: 2013}, {make: 'Tesla', model: 'S', year: 2015}, {make: 'BMW', model: '325i', year: 2012} ] }]) }() );
<!DOCTYPE html> <html ng-app = "WordcountApp" > <head> <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.7.9/angular.min.js"> </script> <script src = "static/main.js" > </script> </head> <body ng-controller = "WordcountController"> <ul ng-repeat = "car in cars" > <!-- Utilizing new interpolation delimiter --> <p> [[ car.make ]] </p> </ul> </body> </html>
另外,我相信更简单的方法应该像
<ul ng-repeat = "car in cars" > <p> {{ '{{ car.make }}' }} </p> </ul>
它将首先使用 Jinja2 模板,原始 HTML 的输出将是正确的 AngularJS 语法。但我不是 100% 确定这种方式,现在无法检查。
此外,在研究您的问题时,我发现了另一种可用于解决您的问题的解决方案。Flask-Triangle 提供了一个过滤器 angular 来告诉 Jinja 表达式的求值是否必须呈现为 Angular 表达式。未定义的变量在 HTML 输出中按原样呈现。
在这种情况下,您的 html 部分代码应如下所示
<body ng-controller = "WordcountController"> <ul ng-repeat = "car in cars" > <p> {{car.make|angular}} </p> </ul> </body>
您可以阅读有关此解决方案的更多信息
推荐阅读
- android - 使用flutter_flavorizr的flutter变体风格 - 如何自定义应用程序图标(android和IOS)?
- javascript - 指南针角度/旋转角度用于在 Javascript 中跟踪方向到 X、Y 位置
- bash - 用于获取用户输入并 grep 文件以获取另一个文件的内容的 Bash 脚本
- java - Lucene 8.5.1 中 IndexReader.getTermVector(int docID ,String field) 中的 docID 是什么,它是如何工作的?
- c - 使用 Windows 在 Python 中编译和执行 C 程序
- cplex - How to use the random function in cplex
- containerd - 无法使用我的容器从 jfrog 工件中提取一些图像
- c++ - OpenGL Hello Triangle 错误
- c - 这些例子正确吗?
- c# - csv文件保存在软件文件夹csvhelper c#中