► factory 較常用的方式var myService = angular.module('MessageService', []);
也可將函是直接寫在 return 內myService.factory('notify', ['$window', function(win) { var msgs = []; var pushMsg = function(msg) { msgs.push(msg); if (msgs.length === 2) { win.alert(msgs.join("\n")); msgs = []; } }; var thank = function thank() { window.alert("Thanks!"); }; //當service提供不只一個方法供外部使用時,則採用此寫法模式 //此法另一優點是給外部使用名稱與內部實際名稱可以脫離 return { addMsg: pushMsg, thankMessage: thank }; }]);
其他方式myService.factory('notify', ['$window', function(win) { var msgs = []; return { addMsg: function(msg) { msgs.push(msg); if (msgs.length === 2) { win.alert(msgs.join("\n")); msgs = []; } } }; }]);
► serviceangular.module('MessageService', []) .factory('notify', ['$window', function(win) { return { addMsg: function(msg) { ... } }; }]); ); angular.module('MessageService', [], function($provide) { $provide.factory('notify', ['$window', function(win) { return { addMsg: function(msg) { ... } }; }]); });
class 方式, 但下方式 Ping 變成屬於全域類, 應該式比較不建議的用法myService.service("notify", ['$window', function(win) { this.msgs = []; this.addMsg = function(msg) { this.msgs.push('click' + (this.msgs.length + 1) + ': ' + msg); if (this.msgs.length === 2) { win.alert(this.msgs.join("\n")); this.msgs = []; } }; }]);
► provider 最基本的產生方式var Ping = function($window) { this.win = $window; this.msgs = []; }; Ping.$inject = ['$window']; Ping.prototype.addMsg = function(msg) { this.msgs.push('click' + (this.msgs.length + 1) + ': ' + msg); if (this.msgs.length === 2) { this.win.alert(this.msgs.join("\n")); this.msgs = []; } }; myService.service('notify', Ping);
provider 本身是沒有提供直接引入其他 service 的入口, 因此要引入其它serivce則須在程式內部進行.
myService.provider('notify', { $get : ['$window', function(win) { var msgs = []; return { addMsg: function(msg) { msgs.push('click'+(msgs.length+1)+': '+msg); if (msgs.length === 2) { win.alert(msgs.join("\n")); msgs = []; } } }; }] });