2013-07-29 31 views
3

我正在開發一個angularJS應用程序,我試圖堅持AngularJs中最有效和廣泛接受的開發風格。 目前,我用我的聲明等服務所以這樣說:AngularJS - 在angular中聲明服務的不同方式有哪些主要區別?

app.factory('MyService', function() { 
    /* ... */ 
    function doSomething(){ 
    console.log('I just did something'); 

    } 

    function iAmNotVisible(){ 
     console.log('I am not accessible from the outside'); 
    } 
    /* ... */ 

    return{ 
    doSomething: doSomething 
    }; 
}); 

不過,也有許多例子在那裏,我不知道如何遵循它的設計風格。能否具有豐富的服務知識的人可以解釋某種風格比另一種更重要的原因?

除了限制訪問我的服務中的某些功能外,我所做的還有什麼用處?

回答

0

我不相信有一個公認的標準,但我自己也遵守這個約定:

var myServiceFn = function (rootScope, http) { ... }; 
... 
app.factory('MyService', ['$rootScope', '$http', myServiceFn]); 

我喜歡這種感覺是不是定義函數內聯清洗劑也允許如果我決定來縮小適當的注射我的文件。 (見http://docs.angularjs.org/tutorial/step_05)。

+1

你在哪裏定義myServiceFn?如果你在外面定義它,是不是會使它成爲全局的? –

+0

將它注入應用程序之後,您可以按照'var myServiceFn = null;'但是是的,爲什麼要在外部定義它,如果目標是保持私有。 – williambq

0

舉個例子,我一直在模塊內定義,像這樣的服務:

angular.module('userModule', []) 
    .service('userService', function() { 
    this.user = null; 

    this.getUser = function() { 
     return this.user; 
    }; 

    this.userIsNull = function() { 
     return (this.user === null); 
    }; 

    this.signout = function() { 
     this.user = null; 
    }; 
    }) 

我覺得更清楚地使用。服務,而不是.factory?

+0

請記住,'服務'和'工廠'做不同的事情,所以它不只是更清楚。 'factory'就像普通函數一樣被調用,'service'是一個用'new'運算符調用的構造函數。 – Duncan

+0

@Duncan,是的同意。我發現服務更像「服務」一樣?例如,當您將模塊注入應用程序時,您只能獲得一個服務,如單例對象?當我想要一個「工廠」時,我使用的工廠,即我的大多數工廠只有一個create()函數返回一個新的對象。服務通常會呼叫工廠爲其創建新對象。對於AngularJS我還是有點新鮮的,所以我可能會陷入設計模式而不是AngularJS術語。 –

6

我建議你佈置你factoryservice因爲他們在做angular-seed app,除了應用煩人只有在services.js樣板使用value。但是,您可以調整它們用於控制器,指令和過濾器的佈局。

'use strict'; 

/* Filters */ 

angular.module('myApp.filters', []). 
    filter('interpolate', ['version', function(version) { 
    return function(text) { 
     return String(text).replace(/\%VERSION\%/mg, version); 
    } 
    }]); 

你會做的服務,意味着:

'use strict'; 

/* Services */ 

angular.module('myApp.filters', []). 
    service('myservice', ['provider1', 'provider2', function(provider1, provider2) { 
     this.foo = function() { 
      return 'foo'; 
     }; 
    }]). 
    factory('myfactoryprovider', ['myservice', function(myservice) { 
     return "whatever"; 
    }]); 

這有更多的樣板絕對比你所需要的,但它是縮小安全,讓您的命名空間的清潔。

比你所要做的是決定哪一個const,value,factoryservice是最合適的。如果要創建單個對象,請使用service:它將作爲構造函數調用,因此您只需將任何方法分配給this,並且所有內容都將共享同一個對象。如果您想要完全控制是否創建對象,但仍然只調用一次,請使用factory。使用value返回一個簡單的值,使用const獲取您可以在config範圍內使用的值。

相關問題