Angularjs使用django的url进行路由

时间:2013-09-19 12:58:57

标签: javascript python django angularjs angularjs-routing

我使用AngularJS作为前端,Django作为后端。

我在后端做了非常简单的事情,所以我没有考虑使用tastypie。

我遇到的问题是客户端/服务器路由。我很困惑。 我所做的是:

  1. 从django中渲染entry.html页面,其中包含<div ng-view></div>。 我假设在此之后路由由angular的routeProvider

  2. 处理
  3. 在我的static / js文件夹中,我有一个文件app.js,它定义了我要填写的表单的另一个模板的路径

  4. 但是,当我运行项目并加载应用程序的输入URL时,我不会被重定向到表单。

    包含所有javascript文件,我在日志中看不到任何404 我在这里做错了什么?

    更新app.js

    App.config(['$routeProvider', function($routeProvider){
        $routeProvider
            .when('/',{templateUrl: '/templates/workflow/request_form.html',     controller:EntryCtrl})
            .otherwise({redirectTo:'/'})
    }]);
    

    entry.html

    {% extends "site_base.html" %}
    {% load staticfiles %}
    
    
    
    {% block body %}
      <div class='ng-app'>
        <div class='row-fluid'>
            <ng-view></ng-view>
           </div>
       </div>
    
    {% endblock %}
    
    {% block extra_script %}
         <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script> 
          <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.min.js">    </script>
          <script src="http://code.angularjs.org/1.0.6/angular-resource.min.js"></script>
          <script src="http://code.angularjs.org/1.0.0rc10/angular-cookies-1.0.0rc10.js">    </script>
          <script src="/static/js/controller.js"></script>
          <script src="/static/js/app.js"></script>
          <script src="/static/js/bootstrap.min.js"></script>
          <script src="/static/js/bootstrap-datepicker.js"></script>
          <script src="https://maps.googleapis.com/maps/api/js?keyAIzaSyCLZKcTGUw9V0-    UcEHuZMCf6uZpNZZaVrg&sensor=false"></script>
    {% endblock %}
    

    controller.js

    var App = angular.module('app', ['ngResource']);
    
    function EntryCtrl($scope, $http, $routeParams, $location, master)
    {
        $scope.form = master.form
    }
    

2 个答案:

答案 0 :(得分:3)

您必须将控制器定义为模块的一部分。请尝试以下方法:

// controller.js
angular.module('app')
       .controller('EntryCtrl', [
          '$scope',
          '$http',
          '$routeParams',
          '$location',
          'master', // this has to be angular injectable
          function($scope, $http, $routeParams, $location, master) {
              $scope.form = master.form;
          }
       ]);

并且您应该只在app.js

中定义一次应用
// angular.js
angular.module('app', ['ngResource'])
       .config([
         '$routeProvider',
         function($routeProvider){
             $routeProvider
                .when('/', {
                    templateUrl: '/templates/workflow/request_form.html',
                    controller: 'EntryCtrl'
                })
                .otherwise({
                    redirectTo: '/'
                });
         }
       ]);

然后确保在模板中定义角度应用程序后包含此内容:

<script src=".../angular.min.js"></script>
<script src=".../app.js"></script> <!-- where app is defined -->
<script src=".../controller.js"></script> <!-- where EntryCtrl is defined -->

答案 1 :(得分:1)

而不是写

  <div class='ng-app'>
    <div class='row-fluid'>
        <ng-view></ng-view>
       </div>
   </div>

你应该写:

{% endraw %}
      <div class='ng-app'>
        <div class='row-fluid'>
            <div ng-view>
        </div>
      </div>
{% endraw %}

{% endraw %}用于告诉模板引擎(如果是jinja2)不考虑这些块之间的内容

我认为angular指令应该在html标记中,而不是像<ng-view>