使用AngularJS ng-repeat渲染表格遇Flask UndefinedError问题求助
解决Flask与AngularJS模板语法冲突导致的
UndefinedError: 'r' is undefined问题 嘿,这个问题我之前也碰到过!核心原因是Flask默认的Jinja2模板引擎和AngularJS的模板语法撞车了——两者都用{{ }}作为变量插值的标记。当Flask渲染index.html的时候,会把AngularJS的{{r.TCID}}当成Jinja2的变量去解析,但此时你的Flask视图函数并没有把r这个变量传给模板,所以就抛出了UndefinedError。
下面给你两种简单的解决办法,还有额外的检查要点:
方法1:自定义AngularJS的插值符号
直接修改AngularJS的变量标记,避开和Jinja2的冲突。比如把{{ }}改成[[ ]]:
首先在你的AngularJS代码里配置插值符号:
// 初始化Angular模块 var myApp = angular.module('myApp', []); // 自定义插值标记 myApp.config(function($interpolateProvider) { $interpolateProvider.startSymbol('[['); $interpolateProvider.endSymbol(']]'); });
然后把HTML里的表格代码改成:
<table> <tr data-ng-repeat="r in regResults"> <td>[[r.TCID]]</td> </tr> </table>
方法2:用Jinja2的raw标签保护Angular代码
如果你不想改Angular的语法,可以用Jinja2的{% raw %}标签把Angular的模板代码包裹起来,告诉Flask不要解析这段内容:
<table> {% raw %} <tr data-ng-repeat="r in regResults"> <td>{{r.TCID}}</td> </tr> {% endraw %} </table>
额外需要确认的点
除了语法冲突,还要确保AngularJS的逻辑是正确的:
- 页面已经正确引入了AngularJS库,并且你的模块(比如
myApp)已经绑定到了DOM上(比如在<html>标签加ng-app="myApp") - 对应的控制器已经正确初始化,并且在Ajax请求成功后,把API返回的数据赋值给了
$scope.regResults。举个例子:
myApp.controller('ResultController', function($scope, $http) { // 调用Flask的REST API $http.get('/api/your-endpoint') .then(function(response) { // 把返回的数据赋值给scope变量,供ng-repeat使用 $scope.regResults = response.data; }) .catch(function(err) { console.log('请求失败:', err); }); });
记得在表格的父元素上加上ng-controller="ResultController",让Angular能找到对应的变量。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

