2015-03-15 9 views
1

Я следую учебнику для изучения углового. Я использую ngRoute, чтобы жениться на 2 наборах представлений/контроллеров.ngRoute in angularjs/multiple views

customers.html и cutomersController и orders.html и ordersController.

Когда index.html загружает его, он показывает customer.html по своему желанию. Но когда я нажимаю ссылку «Просмотреть заказы», ​​она не отображает детали заказа.

Ссылка на код: http://plnkr.co/DW2rqiFIkxnhVPPisfLn

вот код index.html

<!DOCTYPE html> 
<html ng-app="customersApp"> 
<head> 
<title>Route 2</title> 
</head> 
<body> 

    <div ng-view></div> 

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.1/angular.min.js"></script> 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.1/angular-route.min.js"></script> 
<script src="app.js"></script> 
<script src="customersController.js"></script> 
<script src="ordersController.js"></script> 

</body> 
</html> 

здесь код для app.js

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

    app.config(function($routeProvider){ 
     $routeProvider 
      .when('/', { 
       controller: 'CustomersController', 
       templateUrl: 'customers.html' 
      }) 
      .when('/orders/:customerId', { 
       controller: 'OrdersController', 
       templateUrl: 'orders.html' 
      }) 

      .otherwise({ redirectTo: '/' }); 

}); 


here is the code for customersController.js 


app.controller('CustomersController', function ($scope){ 
     $scope.sortBy= 'name'; 
     $scope.reverse = false; 

     $scope.customers=[ 
      { 
       id: 1, 
       joined: '2000-12-02', 
       name:'John', 
       city:'Sacramento', 
       orderTotal:7.554, 
       orders: [ 
        { 
         id:1, 
         product: 'Shoes', 
         total: 7.554 
        } 
        ] 
      }, 
      { 
       id:2, 
       joined: '2012-12-07', 
       name:'Tom', 
       city:'Chandler', 
       orderTotal:19.99, 
       orders: [ 
        { 
         id:2, 
         product: 'Baseball', 
         total: 9.995 
        }, 
        { 
         id:3, 
         product: 'Bat', 
         total: 9.995 
        } 
        ] 
      }, 
      { 
       id: 3, 
       joined: '1997-05-02', 
       name:'Matt', 
       city:'Michigan', 
       orderTotal:19.993, 
       order: [ 
        { 
         id:4, 
         product: 'Tiara', 
         total: 19.993 
        } 
        ] 
      }, 
      { 
       id: 4, 
       joined: '2001-10-08', 
       name:'Jane', 
       city:'New York', 
       orderTotal:112.954, 
       order: [ 
        { 
         id:5, 
         product: 'Stereo', 
         total: 112.954 
        } 
        ] 
      } 
      ]; 

$scope.doSort = function(propName){ 
      $scope.sortBy = propName; 
      $scope.reverse = !$scope.reverse; 
     }; 
}); 

вот код OrdersController.js

(function(){ 
var OrdersController = function ($scope, $routeParams){ 
     var customerId = $routeParams.customerId; 
     $scope.orders = null; 

     function init() { 
     // Search for the customers for the customer id 
     for(var i=0, len=$scope.customers.length; i<len;i++){ 
      if ($scope.customers[i].id === parseInt(customerId)) { 
       $scope.orders = $scope.customers[i].orders; 
       break; 
       } 
      } 
     } 


     $scope.customers=[ 
      { 
       id: 1, 
       joined: '2000-12-02', 
       name:'John', 
       city:'Sacramento', 
       orderTotal:7.554, 
       orders: [ 
        { 
         id:1, 
         product: 'Shoes', 
         total: 7.554 
        } 
        ] 
      }, 
      { 
       id:2, 
       joined: '2012-12-07', 
       name:'Tom', 
       city:'Chandler', 
       orderTotal:19.99, 
       orders: [ 
        { 
         id:2, 
         product: 'Baseball', 
         total: 9.995 
        }, 
        { 
         id:3, 
         product: 'Bat', 
         total: 9.995 
        } 
        ] 
      }, 
      { 
       id: 3, 
       joined: '1997-05-02', 
       name:'Matt', 
       city:'Michigan', 
       orderTotal:19.993, 
       order: [ 
        { 
         id:4, 
         product: 'Tiara', 
         total: 19.993 
        } 
        ] 
      }, 
      { 
       id: 4, 
       joined: '2001-10-08', 
       name:'Jane', 
       city:'New York', 
       orderTotal:112.954, 
       order: [ 
        { 
         id:5, 
         product: 'Stereo', 
         total: 112.954 
        } 
        ] 
      } 
      ]; 
      init(); 
     }; 

     OrdersController.$inject = ['$scope', '$routeParams']; 
     angular.module('customersApp') 
      .controller('OrdersController', OrdersController); 
}()); 

вот код для customers.html

<h2>Customers</h2> 
Filter: <input type="text" ng-model="customersFilter.name"/> 
<br /><br /> 
<table> 
    <tr> 
     <th ng-click="doSort('name')">Name</th> 
     <th ng-click="doSort('city')">City</th> 
     <th ng-click="doSort('orderTotal')">Order Total</th> 
     <th ng-click="doSort('joined')">Joined</th> 
    </tr> 
    <tr data-ng-repeat="cust in customers | filter:customersFilter | orderBy:sortBy:reverse"> 
     <td>{{cust.name}}</td> 
     <td>{{cust.city}}</td> 
     <td>{{cust.orderTotal | currency}}</td> 
     <td>{{cust.joined | date:'longDate'}}</td> 
     <td><a href="#/orders/{{ cust.id }}">View Orders</a></td> 
    </tr> 
    </table> 
<br /> 
<span>Total customers: {{customers.length}}</span> 

вот код для orders.html

<h2>Orders</h2> 
<table> 
    <tr> 
     <th>Product></th> 
     <th>Total</th> 
    </tr> 
    <tr ng-repeat="order in orders"> 
     <td>{{order.product}}</td> 
     <td>{{order.total |currency}}</td> 
    </tr> 
</table> 

Спасибо заранее!

ответ

0

так, к счастью, это простое исправление. Почему-то ваш JSON не является однородным. Хотя эти два customers имеют только один порядок в своем массиве порядка, массив order необходимо переименовать в orders, для Мэтта и Джейн.

Вам просто нужно отредактировать этот жестко закодированный JSON в ordersController.js, и он должен работать.

{ id: 3, joined: '1997-05-02', name:'Matt', city:'Michigan', orderTotal:19.993, order: [ { id:4, product: 'Tiara', total: 19.993 } ] }, { id: 4, joined: '2001-10-08', name:'Jane', city:'New York', orderTotal:112.954, order: [ { id:5, product: 'Stereo', total: 112.954 } ] } ];

В то же время вы должны изменить этот цикл for(var i=0, len=$scope.customers.length; i<len;i++){ if ($scope.customers[i].id === parseInt(customerId)) { $scope.orders = $scope.customers[i].orders; break; } } }

Это отличное место, чтобы использовать метод forEach. $scope.customers.forEach(function(customer) { if (customer.id === parseInt(customerId) { $scope.orders = customer.orders; }) }); Это немного более современно и немного легче читать.