【问题标题】:Issues with controllers in Directives指令中的控制器问题
【发布时间】:2015-04-07 18:27:00
【问题描述】:

我正在尝试更新一个小型个人项目中的一些代码,该项目使用 Angular 以符合更好的实践,我听说 Angular 的未来可以通过将大量功能放入指令控制器中来模仿.我不确定我的理解有多正确,但这似乎是一种组织代码的干净方式。

无论如何,为了解决我的问题,当我给我的指令一个控制器时,我似乎无法让隔离范围工作。我一直在用谷歌搜索我的大脑,试图找出问题所在,我看到了很多关于它的话题,但没有一个能解决我的问题。

这是一个代码片段:

angular.module('myCongresspersonApp')
  .directive('congressPersonPane', function () {

    var controller = [function() {

    }];

    return {
      templateUrl: 'app/congressPersonPane/congressPersonPane.html',
      restrict: 'EA',
            scope: {
                congressPerson: '=info'
            }//,
      // controller: controller,
      // controllerAs: 'paneCtrl',
      // bindToController: true
    };
  });

这实际上只是在我移动功能之前进行测试的一种方法,但是当我取消注释这些行时,我不再有权访问我传入的隔离范围,并且通过它访问的所有数据都消失了(它是一个数组ng-repeat 中的对象)。

我在位于该指令内的指令中也有类似的问题。这个问题让我更加困惑,因为如果我在$scope下定义一个方法,我可以正确使用它,但是当我使用controllerAs时,我不能使用那个方法。所以当我从this website(下面的劳伦提到)中拉出这个实现(以删除范围)时,我很困惑

代码如下:

'use strict';

angular.module('myCongresspersonApp')
  .directive('voteRecord', function () {

        var controller = ['$scope', 'sunlightAPI', function ($scope, sunlightAPI) {
            var voteCtrl = this;
            voteCtrl.voteInfo = [];
            voteCtrl.test = 'Test';
            voteCtrl.pageNumber = 1;
            voteCtrl.repId = '';
            console.log('inside controller definition');

            voteCtrl.getVotingRecord = function(repId) {
              console.log('inside method');
              voteCtrl.repId = repId;
              var promiseUpdate = sunlightAPI.getVotes(repId, pageNumber);
              promiseUpdate.then(function(votes) {
                console.log('fulfilled promise');
                voteCtrl.voteInfo = votes;
                console.log(voteCtrl.voteInfo);
              }, function(reason) {
                console.log('Failed: ' + reason);
              }, function(update) {
                console.log('Update: ' + update);
              });
      };

      voteCtrl.nextPage = function() {
        voteCtrl.pageNumber++;
        voteCtrl.getVotingRecord(voteCtrl.repId, voteCtrl.pageNumber);
      };

      voteCtrl.previousPage = function() {
        voteCtrl.pageNumber--;
        voteCtrl.getVotingRecord(voteCtrl.repId, voteCtrl.pageNumber);
      };

        }];

    return {
      restrict: 'EA',
      scope: {
        repId: '=representative'
      },
      controller: controller,
      contollerAs: 'voteCtrl',
            bindToController: true,
      templateUrl: 'app/voteRecord/voteRecord.html',
    };
  });

我不确定这个问题是否与这个问题有关,但它们看起来很相似。任何可以提供帮助的资源或指导将不胜感激,因为我不想在我的约定不断变化的情况下编写代码,因为我不完全理解为什么一件事有效。

谢谢!

【问题讨论】:

    标签: javascript angularjs angularjs-directive angularjs-scope isolate-scope


    【解决方案1】:

    我不确定我是否完全理解您的问题,但听起来您在从控制器访问 $scope 时遇到问题。您实际上可以将范围传递给控制器​​,如下所示:

    angular.module('myCongresspersonApp')
      .directive('congressPersonPane', function () {
    
        var myController = function($scope) {
          // use $scope in here
        };
    
        return {
          templateUrl: 'app/congressPersonPane/congressPersonPane.html',
          restrict: 'EA',
          scope: {
            congressPerson: '=info'
          },
          controller: ['$scope', myController]
        };
      });
    

    This 博客文章详细介绍了如何在指令中使用控制器。 Angular 文档也将解释更多。祝你好运!

    【讨论】:

    • 我刚刚更新了我的帖子,所以它更清楚一点。我实际上正在寻找删除 $scope 并使用 controllerAs (我实际上是使用您链接的网站来解决这个问题,但显然我要么做错了什么,要么这不是 100% 正确的)。当我不使用 controllerAs 而使用 $scope 时,一切正常。
    • 我明白了。无论如何,您可以将代码发布在 jsfiddle 或任何东西中吗?我对控制器不太熟悉,但从谷歌搜索来看,“this”似乎将取代“$scope”。您的代码将在“voteCtrl.nextPage”和“voteCtrl.previousPage”定义处中断,因为您在“var controller”定义范围之外定义了它们。 This blog post 似乎解释得很好。在您的控制器定义中,您可以使用 this 关键字访问范围。希望这会有所帮助!
    • 这些方法在控制器中,但是奇怪的制表符/空格不一致使它在堆栈溢出编辑器中显得很奇怪。使用 ']' 来告诉它在哪里结束。感谢您尝试提供帮助,但在我提出问题之前,我已经阅读了您发布的所有内容。正如你所看到的,我设置了 var voteCtrl = this;在我的控制器的开头,这只是保持控制器和 html 模板之间一致性的一种方式,它将使用与 controllerAs 中定义的控制器相同的名称。感谢您尝试提供帮助。
    猜你喜欢
    • 2015-05-13
    • 2016-06-14
    • 2014-01-03
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多