角度控制器内的共享方法

时间:2016-11-01 07:50:04

标签: javascript angularjs

我理解如何在各种控制器之间共享方法。例如http://fdietz.github.io/recipes-with-angular-js/controllers/sharing-code-between-controllers-using-services.html。但是,我想知道是否可以共享方法而不必在每个控制器中声明它们。

所以不是......

var app = angular.module("MyApp", []);

app.factory("UserService", function() {
  var users = ["Peter", "Daniel", "Nina"];

  return {
    all: function() {
      return users;
    },
    first: function() {
      return users[0];
    }
  };
});

app.controller("MyCtrl", function($scope, UserService) {
  $scope.users = UserService.all();
});

app.controller("AnotherCtrl", function($scope, UserService) {
  $scope.firstUser = UserService.first();
});

...如果没有语句$scope.users = UserService.all();$scope.users = UserService.all();,是否可以这样做,但仍然可以从视图中获取它们?否则,如果我有十个不同的控制器,我将不得不重复相同的语句十次。

1 个答案:

答案 0 :(得分:0)

我估计你可以简单地使用另一个使用你服务的控制器。然后,将需要访问该数据的任何元素包装在使用新控制器的元素中。

例如,考虑创建以下控制器:

app.controller("UsersCtrl", function(UserService) {
  return {
    all: UserService.all(),
    first: UserService.first()
  };
});

您可以通过简单添加html来注入其数据(您的用户)以及任何与您的服务进行交互的方法。

您之前的位置:

<div ng-controller="AnotherCtrl">
  <p>Hello {{firstUser}}</p>
</div>

......你现在可以使用:

<div ng-controller="UsersCtrl as users">
  <div ng-controller="AnotherCtrl">
    <p>Hello {{users.first}}</p>
  </div>
</div>

您的MyCtrlAnotherCtrl甚至都不必注入UsersService。它们可以简单地改写如下:

app.controller("MyCtrl", function($scope) {
  // ...
});

app.controller("AnotherCtrl", function($scope) {
  // ...
});

这是一个更完整的示例html内容,它重新使用新的UsersCtrl来提供其他控制器使用的数据:

<div ng-controller="UsersCtrl as users">
  <div ng-controller="MyCtrl">
    <h1>Users' contact</h1>
    <p ng-repeat="user in users.all">
      <a href="mailto:{{::getEmailFor(user)}}">{{::getEmailFor(user)}}</a>
    </p>
  </div>
  <div ng-controller="AnotherCtrl">
    <h1>Users' personal information</h1>
    <p ng-repeat="user in users.all" ng-init="colour = getFavouriteColourFor(user)">
      {{user}}'s favourite colour: <span class="text-{{colour}}">{{colour}}</span>
    </p>
  </div>
</div>

此外,根据您的示例数据,这是一个简单的live working example on JSFiddle