AngularJS指令不会检测使用"这个"绑定变量的控制器范围。

时间:2015-04-26 21:02:07

标签: javascript angularjs controller scope directive

我有以下angularJS控制器和指令:

angular.module('twitterApp', [])
    .controller('AppCtrl', AppCtrl)
    .directive('enter', EnterFunc);

function AppCtrl($scope) {
    $scope.loadMoreTweets = function() {
        alert('loading more tweets!');
    }
}

function EnterFunc() {
    return function(scope, element, attrs) {
        element.bind('click', function() {
            scope.loadMoreTweets();
        });
    }
}

以下HTML

  <body ng-app="twitterApp">
    <div class="container" ng-controller="AppCtrl">
      <div enter>
        Roll over to load more tweets
      </div>
    </div>
  </body>

现在,这非常有效,因为我所做的就是从指令访问控制器的范围。但是,我试图调整我的控制器以将变量绑定到&#34;这个&#34;范围,所以我可以使用&#34;控制器作为&#34;但是,当我将控制器功能更改为以下内容时,html上的语法使其更易于阅读:

function AppCtrl() {
    var vm = this;
    vm.loadMoreTweets = function() {
        alert('loading more tweets!');
    }
}

我的示例停止工作,点击指令后出现以下错误:

Uncaught TypeError: scope.loadMoreTweets is not a function

有人可以解释如何在不返回绑定到$ scope的情况下使该指令工作吗?这是不是/工作&#34;控制器As&#34;的Plunkr。版: http://plnkr.co/edit/PyIA4HVOMLn0KNJ5V2bc?p=info

2 个答案:

答案 0 :(得分:0)

我现在修理了它,但发布我的解决方案以防其他人偶然发现这个问题。为了解决这个问题,我使用了“scope.ctrl.loadMoreTweets()”而不是在我的指令上使用“scope.loadMoreTweets()”。即使这很难实现,我也不是很高兴没有“.ctrl”访问父作用域的方法,因为“。$ parent”也没有用。如果有人有更好的解决方案,请告诉我。应该有更多关于使用Controller的Controller As语法指令的文档。

答案 1 :(得分:0)

我修改了您的代码,以传递您想要传递给指令的控制器范围的引用。然后你可以在引用上调用方法。看看这是否适合你

指令:

function EnterFunc() {
  return {
        restrict: 'A',
        scope: {
            controller: '='
        },
        link: link
    }
   function link(scope, element, attrs) {
      element.bind('click', function() {
        //scope.$apply(attrs.action);
        scope.controller.loadMoreTweets();
      });
   }
}

HTML:

<body ng-app="twitterApp">
<div class="container" ng-controller="AppCtrl as ctrl">
  <div enter controller="ctrl">
    Roll over to load more tweets
  </div>
</div>