使用Flask错误Angular.js

Ore*_*lus 3 javascript python flask angularjs

我有以下结构和代码:

project/
       app.py
       templates/
                /index.html
       static/
             /angular.js
Run Code Online (Sandbox Code Playgroud)

的index.html

<!doctype html>
<html ng-app="myApp">
<head>
    <meta charset="utf-8"/>
    <title>My App</title>
</head>
<body ng-controller="myCtrl as ctrl">
    <div>
        {{ctrl.foo}}
    </div>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.js"></script>
    <script type="text/javascript">

        angular.module('myApp', [])
        .controller('myCtrl', [function () {
            var self = this;
            self.foo = 10;
        }]);
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

app.py.

from flask import Flask
app = Flask(__name__)
from flask import render_template

@app.route('/')
def hello_world():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

无论我做什么,我仍然有以下错误:UndefinedError: 'ctrl' is undefined我猜是因为Flask没有加载angular.js

我也试过静态路径

<script type=text/javascript src="{{url_for('static', filename='angular.js')}}"></script><script type=text/javascript src="../static/angular.js"></script>

但仍然没有成功......任何想法?

dir*_*irn 7

当你放

{{ctrl.foo}}
Run Code Online (Sandbox Code Playgroud)

在你的模板中,Jinja寻找一个名为的上下文变量ctrl.您的hello_world端点不提供任何此类变量.

如果您希望ctrl由Angular而不是Jinja处理,您需要告诉Jinja在呈现的HTML中包含花括号.这可以通过包围你在其他花括号中的内容来完成.

{{ '{{ctrl.foo}}' }}
Run Code Online (Sandbox Code Playgroud)

如果你不想要所有花括号,你还有其他几个选择.

您可以使用Jinja rawendraw指令完全按照提供的方式输出其内容.

{% raw %} {{ctrl.foo}} {% endraw %}
Run Code Online (Sandbox Code Playgroud)

另一个选项是更改Angular查找的符号.

var app = angular.module('myApp', []);

app.config(['$interpolateProvider', function($interpolateProvider) {
  $interpolateProvider.startSymbol('[[');
  $interpolateProvider.endSymbol(']]');
}]);
Run Code Online (Sandbox Code Playgroud)

这将允许您使用

[[ctrl.foo]]
Run Code Online (Sandbox Code Playgroud)