javascript - 使用 Foundation for Apps, Controller 和 ng-repeat 出现问题

标签 javascript angularjs

问题

第一次使用 Foundation for Apps 创建 Angular 应用程序,我不清楚应该将新模块放在哪里,是应该放在 client/assets/js/app.js 中还是在一个单独的文件中。

好的,现在我正在尝试使用 ng-repeatng-controller 从 $scope.business = 获取数据以显示在页面上,我已在 client/templates/home.html 中声明,但我只得到 {{business.name}} 和错误 Error: [ng:areq ] 参数“MainCtrl”不是函数,未定义

client/templates/home.html(包含在index.html中)

---
name: home
url: /
---

<div class="grid-container">
    <div class="hero">
        <p class="sponsor">Sponsored by </p>
        <img src="http://placehold.it/200x30" class="sponsors" alt="">
        <h1>Business Directory</h1>
        <div class="find">
            <label for="looking">
                <i class="fa fa-search"></i>
            </label>
            <input type="search" id="looking" placeholder="What are you looking for?">
            <input type="submit">
        </div><!-- /.find -->
        <ul>
            <li class="popular">Popular searches:</li>
            <li>tk-category <span>|</li>
            <li>tk-category <span>|</span></li>
            <li>tk-category <span>|</span></li>
            <li>tk-category <span>|</span></li>
            <li>tk-category </li>
        </ul>
    </div><!-- /.hero -->

    <div class="businesses">
        <p class="number">tk-number of businesses</p><button class="filter button">Filter by <i class="fa fa-chevron-down"></i></button>
        <div class="options">
            <div class="cat">
                <p>Category</p>
                <div class="categories">
                    <div class="group">
                        <p class="name">Grade Level</p>
                        <div class="check">
                            <input type="radio" name=""><p>Auto</p>
                            <input type="checkbox" name=""><p>Restaurant</p>
                            <input type="checkbox" name=""><p>Other</p>
                        </div><!-- /.check -->
                    </div><!-- /.group -->

                    <div class="group">
                        <p class="name">School Type</p>
                        <div class="check">
                            <input type="checkbox">
                            <input type="checkbox">
                            <input type="checkbox">
                            <input type="checkbox">
                            <input type="checkbox">
                        </div><!-- /.check -->
                    </div><!-- /.group -->
                </div><!-- /.categories -->
            </div><!-- /.cat -->
        </div><!-- /.options -->
    </div><!-- /.businesses -->



    <div class="buttons">
        <button class="alp">Alphabetically</button>
        <button class="exp">Expanded</button>
        <button class="con">Condensed</button>
    </div><!-- /.buttons -->

    <div class="grid-block small-up-3" ng-controller="MainCtrl">
        <div class="grid-block" ng-repeat="business in businesses">
            <img src="http://placehold.it/300x300" class="storefront" alt="">
                <p class="name">{{business.name}}</p>
                <p class="description">{{business.description}}</p>
                <p class="address">{{business.address}}</p>
                <a href="" class="website">{{business.website}}</a>
        </div>

        <div class="grid-block">
            <img src="http://placehold.it/300x300" class="storefront" alt="">
                <p class="name">{{business.name}}</p>
                <p class="description">{{business.description}}</p>
                <p class="address">{{business.address}}</p>
                <a href="" class="website">{{business.website}}</a>
        </div>

        <div class="grid-block">
            <img src="http://placehold.it/300x300" class="storefront" alt="">
                <p class="name">{{business.name}}</p>
                <p class="description">{{business.description}}</p>
                <p class="address">{{business.address}}</p>
                <a href="" class="website">{{business.website}}</a>
        </div>
    </div>
</div>

index.html

<!doctype html>
<html lang="en" ng-app="application">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Brandon Sun Business Directory</title>
    <link href="/assets/css/app.css" rel="stylesheet" type="text/css">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
    <link href='http://fonts.googleapis.com/css?family=Lato:300,400,700' rel='stylesheet' type='text/css'>

  </head>
  <body>
    <div class="grid-frame vertical">
      <div class="grid-content shrink" style="padding: 0;">
        <div class="primary condense menu-bar">
        <div class="logo">
          <img src="http://placehold.it/80x45" class="bdnsun" alt="">
          <div class="social">
            <a href="" class="click"><i class="fa fa-twitter"></i></a>
            <a href="" class="click"><i class="fa fa-facebook"></i></a>
          </div><!-- /.social -->
        </div><!-- /.logo -->
        </div>
      </div>
      <div ui-view class="grid-content">
      </div>
    </div>
    <script src="/assets/js/foundation.js"></script>
    <script src="/assets/js/templates.js"></script>
    <script src="/assets/js/routes.js"></script>
    <script src="/assets/js/app.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/2.2.0/isotope.pkgd.js"></script>

  </body>
</html>

app.js

(function() {
  'use strict';

  angular.module('application', [
    'ui.router',
    'ngAnimate',

    //foundation
    'foundation',
    'foundation.dynamicRouting',
    'foundation.dynamicRouting.animations'
  ])
    .config(config)
    .run(run)
  ;

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

  myApp.controller('MainCtrl', ['$scope', function($scope) {
    $scope.business = [
       {
           id: 0,
           name: "Andrew Nguyen",
           description: "I'm a web developer",
           address: "322 11th Street, Brandon, MB",
           website: "http://andrewnguyen.ca"
         },
         {
           id: 1,
           name: "Mary Yacoubian",
           description: "I'm a dental hygenist",
           address: "18 Wishford Drive",
           website: "http://quitecontrary.com"
         },
         {
           id: 2,
           name: "John Axon",
           description: "I'm a jack of all trades",
           address: "1101 Mississauga Rd.",
           website: "http://johnaxon.com"
         }
       ]
  }]);

  config.$inject = ['$urlRouterProvider', '$locationProvider'];

  function config($urlProvider, $locationProvider) {
    $urlProvider.otherwise('/');

    $locationProvider.html5Mode({
      enabled:false,
      requireBase: false
    });

    $locationProvider.hashPrefix('!');
  }

  function run() {
    FastClick.attach(document.body);
  }

})();

最佳答案

演示:http://plnkr.co/edit/Xuay1WtTbdMBmHXEq1R7?p=preview

JS:

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

myApp.controller('MainCtrl', function($scope) {
  $scope.businesses = [
     {
         id: 0,
         name: "Andrew Nguyen",
         description: "I'm a web developer",
         address: "322 11th Street, Brandon, MB",
         website: "http://andrewnguyen.ca"
       },
       {
         id: 1,
         name: "Mary Yacoubian",
         description: "I'm a dental hygenist",
         address: "18 Wishford Drive",
         website: "http://quitecontrary.com"
       },
       {
         id: 2,
         name: "John Axon",
         description: "I'm a jack of all trades",
         address: "1101 Mississauga Rd.",
         website: "http://johnaxon.com"
       }
     ]
});

添加ng-app="applicationbody标签。你的 JS 文件中有一个拼写错误。 应该是$scope.businesses而不是$scope.business如 HTML ng-repeat="business in businesses" 所示将迭代 businesses并将每个对象分配给 business (别名)用于提取数据。

<小时/>

更新 - 根据 Github 代码,按所述编辑以下文件:

app.js

'use strict';

  var myApp = angular.module('application', [
    'ui.router',
    'ngAnimate',

    //foundation
    'foundation',
    'foundation.dynamicRouting',
    'foundation.dynamicRouting.animations'
  ])
    .config(config)
    .run(run)
  ;

  config.$inject = ['$urlRouterProvider', '$locationProvider'];

  function config($urlProvider, $locationProvider) {
    $urlProvider.otherwise('/');

    $locationProvider.html5Mode({
      enabled:false,
      requireBase: false
    });

    $locationProvider.hashPrefix('!');
  }

  function run() {
    FastClick.attach(document.body);
  }

删除<script src="/assets/js/scripts.js"></script>来自您的 index.html 文件。

scripts.js

myApp.controller('MainCtrl', function($scope) {
  $scope.businesses = [
     {
         id: 0,
         name: "Andrew Nguyen",
         description: "I'm a web developer",
         address: "322 11th Street, Brandon, MB",
         website: "http://andrewnguyen.ca"
       },
       {
         id: 1,
         name: "Mary Yacoubian",
         description: "I'm a dental hygenist",
         address: "18 Wishford Drive",
         website: "http://quitecontrary.com"
       },
       {
         id: 2,
         name: "John Axon",
         description: "I'm a jack of all trades",
         address: "1101 Mississauga Rd.",
         website: "http://johnaxon.com"
       }
     ]
});

gulpfile.js中,修改以下行:

// These files are for your app's JavaScript
appJS: [
  'client/assets/js/*.js'
]

*.js* will copy all the js files in the build folder, the errors you were getting were because your scripts.js file wasn't copy in the build and therefore MainCtlr` 未定义。

希望它现在对您有用。

关于javascript - 使用 Foundation for Apps, Controller 和 ng-repeat 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30514901/

相关文章:

javascript - SVG 图像元素在旋转时被裁剪

javascript - AngularJS - 从数组中获取最后一个空白元素的索引

javascript - 在 ionic 应用程序中共享 PDF

javascript - 在 Javascript 中提交表单时传递对象

javascript - 通过javascript代码更改html中的文本颜色

javascript - 将 JS 和 jQuery 重新制作成 AngularJS

javascript - 将表格单元格数据转换为单独的 .js 文件中的内部链接

javascript - 如何使用 Jquery 动态更改元素的 css 类?

javascript - 由于事件导致模型更改后,AngularJS 不刷新 View

javascript - 改变 Angular 的方向