我刚开始接触角。 读谷歌文档服务的例子,我只是想知道你为什么会选择使用服务而保持变量和函数就在控制器?
angular.
module('MyServiceModuleDI', []).
factory('notify', function($window) {
var msgs = [];
return function(msg) {
msgs.push(msg);
if (msgs.length == 3) {
$window.alert(msgs.join("\n"));
msgs = [];
}
};
});
function myController($scope, notify) {
$scope.callNotify = function(msg) {
notify(msg);
};
}
当你会选择在这种情况下使用服务?
在我的意见的主要理由是:
坚持和控制器之间的数据共享。
IE:您创建需要去抓取数据,形成数据库,如果你将其存储在控制器内,一旦更改到另一个控制器的数据将被丢弃(除非你把它存储在$ rootScope服务但这不是做的最好的方法它),但是如果你把它的业务(服务是单身)内,该数据将在更改控制器上保持不变。
通过创建将由你自己的控制器/指令/服务中使用的API抽象的数据访问逻辑。
保持业务逻辑内部控制器和数据逻辑里面的服务。
DRY(不要重复自己)。
IE:你有一个系列的,需要在不同的控制器需要的功能,没有服务,你必须重复你的代码中的每个控制器,具有服务,您可以创建此功能的单一API,并在每个控制器/它注入指令/服务需要。
下面是一个例子:
var myApp = angular.module('myApp',[]);
//Here is the service Users with its functions and attributes
//You can inject it in any controller, service is a singleton and its data persist between controllers
myApp.factory('Users', function () {
//data logic
//fetch data from db and populate...
var name = "John";
var surname = "Doe"
function getName() { return name; }
function getFullName() { return name + ' ' + surname; }
function setName(newName) { name = newName; }
//API
return {
getName: getName,
getFullName: getFullName,
setName: setName
}
});
//An Util service with methods I will use in different controllers
myApp.factory('Util', function () {
//a bunch of useful functions I will need everywhere
function daysInMonth (month,year) {
return new Date(year, month+1,0).getDate();
}
return {
daysInMonth: daysInMonth
};
});
//Here I am injecting the User and Util services in the controllers
myApp.controller('MyCtrl1', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {
$scope.user = Users.getFullName(); //"John Doe";
Users.setName('Bittle');
//Using Util service
$scope.days = Util.daysInMonth(05,2013);
}]);
myApp.controller('MyCtrl2', ['$scope', 'Users', 'Util', function ($scope, Users, Util) {
$scope.user = Users.getFullName(); //"Bittle Doe"; //The change that took place in MyCtrl1 hhas persisted.
}]);
根据我的经验,服务派上用场,在下列情况:
当您希望两个或多个控制器之间共享信息
人们可以使用$rootScope
到控制器之间也沟通,但作为常见的陷阱文档的部分建议,应避免尽可能多的,因为它是一个全球性的范围。 使用服务,我们可以定义可以很容易地用于控制器之间交换数据setter和getter方法。
当一个功能是可多次使用
比方说,你有横跨你的所有模板重复一个功能 - 比如在你需要反复从美元转换为货币欧元和显示的金额给用户的东西。 在这里,你可以承担的“量”是从购买机票东西,在网上买一些书 - 任何金钱有关。
这个功能将在您的所有模板被用来在欧洲的客户始终显示量 - 但在你的数据库/模式,量储存在欧洲。
因此,你可以创建金额从美元转换成欧元的服务。 任何控制器可以调用它,使用它。 您的功能现在位于一个单独的地方,而不是跨控制器。 所以,如果你决定要更改和显示英镑金额的未来,你需要做出的改变只在一个地方,它会在所有的控制器中反映利用它。
还有一些其他的使用情况,但只有这些目前来我的心现在。 我发现使用自己的服务点是1号最频繁使用的情况下 - 控制器之间传递数据。
如果你想保持一个变量在内存中(为什么不呢,例如用户会话)期间导航(带diffents控制器型动物谐音的称呼)。 你必须记住:
除了上面列出的好处,它也可以帮助你把你的应用程序结构为独立的组件,这使得它更容易理解和可测试性为好。
想象具有在多个位置,以测试类似的功能,而不是在中央位置它定义/调试和其他地方(多次)使用。
也提醒角服务单一对象(这是非常重要的,所以我们可以很容易地分享它通过项目),该应用程序的生命周期中实例化一次。 它们包含整个应用程序的生命周期内确保数据的方法,即数据没有得到更新,并提供所有的时间。 的服务的主要目的是与角应用的不同的组件来组织和共享商务逻辑,模型,或数据和功能。