2016-11-12 127 views
0

訪問私有變量我寫了下面的工廠:AngularJS工廠 - 從方法

.factory('UserFact', function() { 
    var user = []; 
    return { 
    'setUser': function(user) { 
    this.user = user; 
     console.log('(1) User set: ' + this.user); 
     console.log('(2) User id is now: ' + this.user.uid); 
    }, 
    'updateSport': function(sportid) { 
    console.log('(3)Update sport ' + sportid + 'for user id ' + this.user.uid); 
    } 
} 

使用它通過以下方式在我的控制器:

function ($scope, $stateParams, DatabaseFact, UserFact) { 

    // variables 
    $scope.sports = []; 
    $scope.sports = DatabaseFact.getSports(); 

    // functions 
    $scope.updateSport = UserFact.updateSport; 

    // execution 
    UserFact.setUser({uid: '123456', name: 'forrest'}); 
} 

並通過列表從我的觀點觸發它觸發按鈕:

updateSport(sport.id) 

我的問題是,控制檯日誌打印如下:

(1) User set: [Object] Object 
(2) User id is now: 123456 
(3) Update sport 1 for user id undefined 

您是否知道爲什麼我的用戶標識在日誌3中未定義?

感謝

回答

0

我不知道你是多麼熟悉JavaScript,但我懷疑你被抓出來您的兩個函數調用中的this引用有所不同。

要在這兩個函數中調試此嘗試日誌記錄this到控制檯。你應該注意到它們不同,這就解釋了你的問題的原因。

修復可能是不使用this關鍵字,例如,功能setUser將成爲:

'setUser': function(_user) { 
    user = _user; 
} 

你可以找到關於JS this更多信息,谷歌,嘗試https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this的一個開始。

+0

我來自C++和Java。我在JavaScript中使用範圍非常困難,在JS中看起來更難以理解...... –

0

這是不確定的,因爲你的函數使用this,但是從它的原始對象(用戶服務)範圍複製。

您可以停止使用this,而是使用user變量,您聲明並初始化爲空數組(爲什麼,順便說一句?),但從來沒有使用過其他地方,或者做

$scope.updateSport = function() { 
    UserFact.updateSport; 
} 

注你命名你的服務「UserFact」,但它不是一個實體。它不創造任何東西。它只允許設置用戶並更新其運動。那不是工廠。工廠是用來創造事物的對象。這裏的工廠是傳遞給module.factory()的函數,它用於創建和返回服務實例,最好叫做UserService

+0

我來自C++,我用它來初始化它們即將變成的類型的變量;這裏的用戶是一個數組。你推薦別的嗎?另外,我無法找到工廠與服務之間真正區別的任何可以理解的解釋嗎?任何建議? –

+0

服務是控制器和其他服務使用的內容。服務是在其他服務,控制器,指令等中通過角度注入的內容。具有兩個方法setUser()和updateSport()的對象是服務。傳遞給factory()函數的函數是工廠:它創建並返回服務。假設你調用了'UserFact.setUser({uid:'123456',name:'forrest'});',用戶不是一個數組。這是一個對象。 –

1

由於其實施的原因,這對我來說很有意義。在您的控制器中,您實際上是將方法引用複製到$ scope.updateSport。所以無論何時執行方法,它都會在控制器和this - > $ scope實例的上下文中執行,但不是一個服務實例。

由於你的控制器已經有了uid,它只是返回undefined。

要解決這個問題,你需要有一個方法體updateSort並調用UserFact.updateSport

$scope.updateSport = function(){ 
    UserFact.updateSport(); 
}