【问题标题】:AngularJS component controller syntaxAngularJS 组件控制器语法
【发布时间】:2017-02-16 17:54:08
【问题描述】:

我有一个component(),它注入了一个导航。当我尝试像这样在 component 中包含 controller 时,出现错误。

nav.html 内

<nav class="navbar navbar-inverse navbar-fixed-top">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Demo</a>
    </div>
    <div id="navbar" class="collapse navbar-collapse" ng-controller="MainMenuController">
      <ul class="nav navbar-nav">
        <li ng-class="{ active: isActive('') }"><a href="./">home</a></li>
        <li ng-class="{ active: isActive('/skus') }"><a href="sku.html">sku</a></li>
        <li ng-class="{ active: isActive('/phones') }"><a href="phone.html">phone</a></li>
      </ul>
    </div><!--/.nav-collapse -->
  </div>
</nav>


component.js 内部

angular.
module('mainMenu').
component('mainMenu', {
  templateUrl: 'app/core/nav/nav.html',
  controller: 'MainMenuController', ['$scope', '$location', 
    function NavController($scope, $location) {
        $scope.isActive = function (viewLocation) { 
          var p1 = $location.path();
          var p2 = '/' + p1.split("/")[1]; // split string from '/';
          if(p2=='/undefined') p2 = '';
          return viewLocation === p2;
        }
    }
  ]
});

但是,如果我像这样编写一个单独的控制器,一切都会正常工作。 component() 我做错了什么,我不应该将控制器包含在 component() 中以获得最佳实践吗?

angular.
module('mainMenu').
component('mainMenu', {
  templateUrl: 'app/core/nav/nav.html',
});


angular.
module('mainMenu').
controller('MainMenuController', ['$scope', '$location', 
      function NavController($scope, $location) {
        //this.navs = Nav;
        $scope.isActive = function (viewLocation) {
          var p1 = $location.path();
          var p2 = '/' + p1.split("/")[1]; // split string from '/';
          if(p2=='/undefined') p2 = '';
          return viewLocation === p2;
        };
      }
]);


我把我的component 改成了这个

angular.
module('mainMenu').
component('mainMenu', {
  templateUrl: 'app/core/nav/nav.html',
  controller: ['$scope', '$location', 
    function MainMenuController($scope, $location) {
      //this.navs = Nav;
      $scope.isActive = function (viewLocation) {
        var p1 = $location.path();
        var p2 = '/' + p1.split("/")[1]; // split string from '/';
        if(p2=='/undefined') p2 = '';
        return viewLocation === p2;
      };
    }
  ]
});

收到错误Error: [ng:areq] http://errors.angularjs.org/1.5.8/ng/areq?p0=MainMenuController&p1=not%20a%20function%2C%20got%20undefined N



修复:通过清理 modulecomponent 标题并使它们唯一,从模板中删除 ng-controller;尼尔汉密尔顿的回答解决了我原来的问题。

【问题讨论】:

  • 要么指定控制器名称,要么指定控制器功能,但不能同时指定两者。删除'MainMenuController', 。另外,请永远不要再问一个问题,只是说“我有一个错误”。而是发布准确且完整的错误消息。
  • “我收到一个错误。” 什么错误??
  • 用错误输出改变了我的问题
  • 在您的第一个示例中,您将组件命名为与您的模块相同,这是一个禁忌。此外,您寻求的所有信息都记录在angular documentation for components
  • 再说一次,这个最新的更新验证了我的理论。您在模板中有一个ng-controller 引用。控制器被提供给整个模板,然后您尝试 重新绑定 same 控制器到模板内的元素。当您在模板之外声明控制器时,它可能会起作用,但它可能不会按您期望的方式工作,因为您实际上有同一个控制器对象的两个实例。如果只将控制器声明为属于组件,它肯定根本不起作用。

标签: angularjs


【解决方案1】:

这是我添加控制器时的偏好...

MainMenuController.$inject = ['$scope', '$location'];
function MainMenuController($scope, $location) {}

angular.module('menu').component('mainMenu', {
    controller: MainMenuController,
    controllerAs: 'MainMenuController',
    templateUrl: 'app/core/nav/nav.html'
});

您尝试使用内联依赖项的样式...

angular.module('menu').component('mainMenu', {
    controller: ['$scope', '$location', function($scope, $location) {}],
    controllerAs: 'MainMenuController',
    templateUrl: 'app/core/nav/nav.html'
});

不同之处在于您拥有带有控制器声明的 ControllerAs 字符串。您应该使用 controllerAs: "NameForController" 属性来命名控制器。

祝你好运!

【讨论】:

  • 当我使用你的第一个答案时,我仍然得到Error: [ng:areq] http://errors.angularjs.org/1.5.8/ng/areq?p0=MainMenuController&amp;p1=not%20a%20function%2C%20got%20MainMenuController N/
  • 该错误表明您将字符串“MainMenuController”而不是函数传递给控制器​​属性。
  • 但我的设置和你的完全一样。
  • 我想我在 controllerAs: 'MainMenuController' 之后忘记了一个逗号,
  • 那个小提琴的工作代码就像我第一个例子中的代码一样。希望这将有助于解决问题。
猜你喜欢
  • 1970-01-01
  • 2014-07-27
  • 2014-02-12
  • 1970-01-01
  • 2016-10-30
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多