如何在众多不同的控制器之间共享$ scope函数?

时间:2013-10-15 07:42:55

标签: angularjs

我有许多不同的控制器。这些控制器中的每一个都使用 这样的一些功能:

    $scope.isNotString = function (str) {
        return (typeof str !== "string");
    }

我不想继续向每个控制器添加此功能。我有办法吗? 可以将函数放在一个文件中,然后只从每个文件引用该文件 控制器?

3 个答案:

答案 0 :(得分:1)

如果你有一个所有控制器的父控制器,那么最好添加它,或者你可以创建一个utilityService并将其注入每个必要的控制器。

如果将其添加到父控制器中,则自动所有子控制器都会继承父控制器的范围。

答案 1 :(得分:1)

您有几种选择:

在根范围(或父范围)上定义函数

除了隔离范围外,它也会出现在子范围内(感谢prototypal inheritance)。

声明服务

如果您需要与隔离范围共享内容,这是一个很好的解决方案。如果您的应用被称为myApp

myApp.service('stringUtil', function () {
  this.isNotString = function (str) {
    return (typeof str !== "string");
  };
});

myApp.directive('something', function (stringUtil) {
  return {
    link: function (scope, element, attr) {
      scope.isNotString = stringUtil.isNotString;
    }
  };
});

使用指令控制器

附加到同一标签的指令可以共享其控制器。这在您的情况下似乎没有用,但如果您需要标记上的共享状态,则会有所帮助。例如,我有一个指令modal,它共享函数来打开一个模态。

myApp.directive('modal', function () {
  return {
    controller: function () {
      this.openModal = function() {…};

      this.close = function() {…};
    }
  };
});

myApp.directive('userSettings', function () {
  return {
    restrict: 'E',

    require: 'modal',

    link: function (scope, element, attr, modalController) {
      scope.close = modalController.close;
    }
  };
}};

标记为:

<user-settings modal>
  <a ng-click="close()">Close</a>

  <h1>User Settings</h1>
</user-settings>

答案 2 :(得分:1)

为了让两个控制器共享数据或方法,您可以创建一个注入所需控制器的服务,因此每个控制器都可以访问该服务方法。我已经为您提供了一个工作示例,显示了两个控制器,两个控制器都注入了共享服务,每个控制器都从共享服务调用相同的方法。

app.service('myService',function(){
   this.sharedFunction = function() {
      //do some stuff
   };
});

myCntrl1($scope,myService) {
   $scope.doSomething = function() {
      myService.sharedFunction();
   }
}

myCntrl2($scope,myService) {
   $scope.doSomething = function() {
      myService.sharedFunction();
   }
}