AngularJS指令:具有命名控制器的范围

时间:2015-05-26 07:44:43

标签: angularjs controller directive

我有以下示例。

HTML:

<body ng-controller="MainCtrl as MgtCtrl">
    <p>Hello {{MgtCtrl.name}}!</p>
    <p>Result is {{MgtCtrl.result}}!</p>
    <output-content data="MgtCtrl.name" result="MgtCtrl.result"></output-content>
</body>

JavaScript的:

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

app.controller('MainCtrl', function($scope) {

  var MgtCtrl = this;

  MgtCtrl.name = 'World';
  MgtCtrl.result = "no";

  MgtCtrl.changeLabel = function() {
    alert('changeLabel');
    MgtCtrl.result = 'yes';
  }
});

app.directive('outputContent', function() {
  return {
    restrict: 'E',
    replace: true,
    templateUrl: 'outputContent.html',
    scope: {
      data: '=',
      changeLabel: '&',
      result: '='
    },
    controller: 'MainCtrl',
    controllerAs: 'MgtCtrl'
  };

});

ouputContent.html:

<div>
  {{data}}
  <button ng-click="MgtCtrl.changeLabel()">Change</button>
</div>

Plunker是:http://plnkr.co/edit/BW8VDyCaRnRgxE8I9JJy

当我点击“更改”按钮时,我希望结果为“是”。

由于命名控制器,它不起作用。

您能否请您解释如何编写指令?

问候。

2 个答案:

答案 0 :(得分:2)

您从未将范围变量绑定到指令中的命名控制器。

您必须将属性 bindToController:true 添加到指令定义中,如此plunker:

http://plnkr.co/edit/2QdnkpeuTM6adG9KoyJT?p=preview

指令代码:

app.directive('outputContent', function() {
  return {
    restrict: 'E',
    replace: true,
    templateUrl: 'outputContent.html',
    scope: {
      data: '=',
      changeLabel: '&',
      result: '='
    },
    controller: 'MainCtrl',
    controllerAs: 'MgtCtrl',
    bindToController: true
  };

});

这将把数据和结果绑定添加到相应的指令控制器。

答案 1 :(得分:0)

我认为在这种情况下,您不需要在指令中指定控制器。

app.directive('outputContent', function() {
return {
    restrict: 'E',
    replace: true,
    templateUrl: 'outputContent.html',
    scope: {
      data: '=',
      changeLabel: '&',
      result: '='
    }
  };

});

另外html应该更新:

<body ng-controller="MainCtrl as MgtCtrl">
    <p>Hello {{MgtCtrl.name}}!</p>
    <p>Result is {{MgtCtrl.result}}!</p>
    <output-content data="MgtCtrl.name" result="MgtCtrl.result" change-label="MgtCtrl.changeLabel()"></output-content>
  </body>