如何在指令链接中访问控制器功能?

时间:2015-03-22 10:28:08

标签: javascript angularjs angularjs-directive angularjs-scope

如何从指令链接访问指令控制器功能?传递给链接的Bellow控制器是空的,我想进入show()hide()函数。

我当前的指示:

app.directive('showLoading', function() {
  return {
    restrict: 'A',
    // require: 'ngModel',
    scope: {
      loading: '=showLoading'
    },
    controller: function($scope, $element) {
      return {
        show: function() {
          alert("show");
        },
        hide: function() {
          alert("hide");
        }
      };
    },
    link: function($scope, $element, $attrs, controller) {
      $scope.$watch('loading', function(bool) {
        if (bool) {
          controller.show();//undefined
        } else {
          controller.hide();
        }
      });
    }
  };
});

2 个答案:

答案 0 :(得分:30)

在范围上发布可以起作用,但不是最佳实践,因为它“污染”了范围。与自己的控制器通信的正确方法是require - 然后它将作为link函数的参数以及其他必需的指令使用。

另一个问题是如何在控制器上公开函数 - 这是通过使用this.someFn完成的,而不是通过返回对象来完成的。

app.directive('showLoading', function() {
  return {
    restrict: 'A',
    require: ['ngModel', 'showLoading'], // multiple "requires" for illustration
    scope: {
      loading: '=showLoading'
    },
    controller: function($scope, $element) {
      this.show = function() {
        alert("show");
      };

      this.hide = function() {
        alert("hide");
      };
    },
    link: function($scope, $element, $attrs, ctrls) {
      var ngModel = ctrls[0], me = ctrls[1];

      $scope.$watch('loading', function(bool) {
        if (bool) {
          me.show();
        } else {
          me.hide();
        }
      });
    }
  };
});

答案 1 :(得分:-2)

控制器功能内部存在某种问题

这里的代码工作正常

app.directive('showLoading', function() {
  return {
    restrict: 'AE',
    // require: 'ngModel',
    scope: {
      loading: '=showLoading'
    },
    controller: function($scope, $element) {
        $scope.show = function() {
          alert("show");
        },
        $scope.hide = function() {
          alert("hide");
        }
    },
    link: function($scope, $element, $attrs) {
      $scope.$watch('loading', function(bool) {
        if (bool) {
          $scope.show();//undefined
        } else {
          $scope.hide();
        }
      });
    }
  };
});