正确的" Angular"将行为传递给指令的方法?

时间:2016-04-19 04:28:11

标签: javascript angularjs angularjs-directive

在查找有关Angular指令和将行为传递给指令的信息时,我最终被指向隔离范围上方法绑定的方向,即

scope: {
  something: '&'
}

此功能的documentation有点令人困惑,我不认为它最终会按照我的意愿行事。

我最终提出了这个片段(为了简洁而简化),它通过在HomeCtrl中传递范围函数来工作,并且该指令完成它的工作并调用该函数。 (只是重要的是,真正的代码会传回指令的承诺)。



angular.module('app', []);

angular.module('app')
  .directive('passingFunction',
    function() {
      var changeFn,
        bump = function() {
          console.log('bump() called');
          internalValue++;
          (changeFn || Function.prototype)(internalValue);
        },
        internalValue = 42;

      return {
        template: '<button ng-click="bump()">Click me!</button>',
        scope: {
          onChange: '<'
        },
        link: function(scope, element, attrs) {
          if (angular.isFunction(scope.onChange)) {
            changeFn = scope.onChange;
          }

          scope.bump = bump;
        }
      };
    })
  .controller('HomeCtrl',
    function($scope) {
      $scope.receive = function(value) {
        console.log('receive() called');
        $scope.receivedData = value;
      };
    });
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.4/angular.min.js"></script>
<div ng-app="app" ng-controller="HomeCtrl">
  <passing-function on-change="receive"></passing-function>
  <p>Data from directive: {{receivedData}}</p>
</div>
&#13;
&#13;
&#13;

这是一个合适的&#34; Angular&#34;实现这个目标的方式?这似乎有效。

1 个答案:

答案 0 :(得分:1)

您需要将函数传递给指令。我会做一个很小的例子。

在控制器上:

$scope.thisFn = thisFn(data) { console.log(data); };

在html中:

<my-directive passed-fn="thisFn()"></my-directive>

指令:

.directive('myDirective', [
  () => {
    return {
      restrict: 'E',
      scope: {
        passFn: '&'
      },
      template: '<div id="myDiv" ng-click="passFn(data)"></div>',
      link: (scope) => { 
          scope.data = "test";
      }
    }
  }]);