javascript - View 的 AngularJS 路由问题

标签 javascript angularjs angular-routing

我正在尝试创建一个包含商店列表的单页应用程序,在每张商店卡片中都是指向另一个包含产品表的 View 的链接。

商店看起来像:

shop = {
  id: 1,
  name: "foo",
  description: 'bar',
  products: [item1, itemn];
};

应用程序.js:

angular
  .module('lightpointTestApp', [
    'ngCookies',
    'ngRoute',
    'ui.sortable'
  ])
  .config(function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl'
      })
      .when('/about', {
        templateUrl: 'views/about.html',
        controller: 'AboutCtrl'
      })
      .when('/products/:shopID', {
        templateUrl: 'views/products.html',
        controller: 'ProductsCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  });

Main.html 查看商店列表在哪里:

<h3>Shop list</h3>
<div class="row shopsContainer" ui-sortable ng-model="shops">

  <div class="col-lg-3 shopCard" ng-repeat="shop in shops">
    <button class="btn close cardClose" ng-click="removeShop($index)">&times;</button>
    <div class="cardNumber">{{ shops.indexOf(shop) + 1 }}</div>
    <div class="cardHeader">{{ shop.name }}</div>
    <div class="cardBody">
      {{ shop.address }}<br />
      {{ shop.hours }}<br />      
      <a href="/#/products/{{ shop.id }}">View {{ shop.products.length }} products</a>
    </div>
  </div>

</div>
<div class="row">
  <input type="text" ng-model="newShop.name" placeholder="Shop name" class="col-lg-3" />
  <input type="text" ng-model="newShop.address" placeholder="Shop address" class="col-lg-3" />
  <input type="text" ng-model="newShop.hours" placeholder="Shop hours" class="col-lg-3" />
  <button class="btn btn-primary col-lg-3" type="button" ng-disabled="!newShop.name || !newShop.address || !newShop.hours" ng-click="addShop()">Add Shop</button>
</div>

</span>
</div>
</div>

products.js - 产品页面的 Controller

angular.module('lightpointTestApp')
  .controller('ProductsCtrl', function ($scope, $routeParams, shops) {
    $scope.shopList = shops;
    $scope.shop = {};

    $scope.getShop = function (id) {
      for (var i = 0; i < $scope.shopList.length; i++) {
        if ($scope.shopList[i].id === id) {
          return $scope.shopList[i];
        }
      }
      return null;
    };

    var shopID = $routeParams.shopID;
    $scope.shop = $scope.getShop(shopID);

  })

products.html 产品表在哪里

<h2>{{ shop.name }}</h2>
  <table class="table table-hover">
    <tr>
      <th>Product Name</th>
      <th>Product Description</th>
    </tr>
    <tr ng-repeat="product in shop.products">
     <td> {{ product.name }} </td>
     <td> {{ product.description }} </td>      
    </tr>
  </table>

问题是 products.html 没有与 products.js 绑定(bind)并显示类似 {{shop.name}} 的内容和一个空表。

附言我认为 products.js 不正确,但我已尽一切努力做好它。

谢谢。

最佳答案

您在 ProductsCtrl 中有一个参数 shops,但是没有任何东西可以为它传递值,因此它将是 null。您将 $scope.shopList 的值设置为它,然后尝试遍历 NULL 数组,因此您会得到一个异常。

您可以将 shops 的值存储在服务中,然后通过注入(inject)将它们传递给您的应用程序。您可以在 main.js 或服务本身中初始化它们的值,然后如果将它们注入(inject) ProductsCtrl 中,这些值将可用,类似于

angular.module('lightpointTestApp')
      .controller('ProductsCtrl', ['$scope', '$routeParams', 'shopsService', 
         function ($scope, $routeParams, shopsService) {
             $scope.shopList = shopService;
             $scope.shop = {};

             $scope.getShop = function (id) {

                for (var i = 0; i < $scope.shopList.length; i++) {
                  if ($scope.shopList[i].id === id) {
                     return $scope.shopList[i];
                  }
                }
                return null;
             };

            var shopID = $routeParams.shopID;
            $scope.shop = $scope.getShop(shopID);

        }]);

shopsService 看起来像

angular.module('lightpointTestApp')
   .service('shopsService', function() {
       return [ 
                // add whatever fields you need here from code in main.js
                { name: 'shop1', address: 'addr1' },
                { name: 'shop2', address: 'addr2' }
              ];
   });

关于javascript - View 的 AngularJS 路由问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29683657/

相关文章:

javascript - 从 div 和 javascript/jquery 调用 cgi 脚本

javascript - 向 Javascript "Pong"游戏添加背景图像

javascript - 在文本 Angular 文本上添加工具提示

javascript - AngularJS 指令 : template with scope value (ng-bind-html)

javascript - AngularJS 带参数动态排序函数

javascript - Angular 6 从 url 中删除查询字符串

angular - 在 app-routing.module.ts 中添加了新路由 - ngxAdmin 不起作用

javascript - 如何根据xml数据移动表格中的单元格?

angular - 在哪里声明 Angular catch all (Not found) 路由

javascript - Android 的某种 JavaScript 的 preventDefault