我理解如何在各种控制器之间共享方法。例如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();
,是否可以这样做,但仍然可以从视图中获取它们?否则,如果我有十个不同的控制器,我将不得不重复相同的语句十次。
答案 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>
您的MyCtrl
和AnotherCtrl
甚至都不必注入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。