2013-06-24 111 views
4

我有一個用戶偏好工廠,用於保存用戶的偏好值。當頁面加載時它是空的。用戶登錄後會填寫用戶配置文件。 僞代碼角度:在工廠模型更新不反映在控制器

app.factory('pref', function($rootScope){ 
    var pref = {}, age, name;   
    $rootScope.$on('logged.in', function(){ 
     pref.name = 'sam'; 
     pref.age = 30; 
     pref.currency = '$'; 

     age = getAge(); name = getName(); 
    }) 

    function getName(){ 
     //format name 
     return name; 
    } 
    function getAge(){ 
     return age; 
    } 
    return { 
     currency: pref.currency, 
     age: age, 
     name: name 
    } 
    }) 

然後我注入在我的控制器廠:

app.controller('MainCtrl', function($scope, pref) { 
    $scope.name = pref.name; //Return undefined 
    var currency = pref.currency; 
    $scope.price = function(amount){ 
    return amount + currency; //don't show $ sign 
    } 
}); 

從PREF工廠返回值控制器不更新。我如何使它工作?

編輯:plunkr http://plnkr.co/edit/SKJC5hUPEm72JqGJyT9y

+1

我沒有在你的代碼中看到logged.in解僱你能告訴在哪個位置你觸發事件 –

+0

是我還是你從未設定過一個名字的價值?控制器中的pref.name調用getName(),它返回名稱,但名稱再次調用getName()? pref.name已設置,但這是一個不同的對象,不是您返回的對象。 – Narretz

+0

@Ajaybeniwal這是一個psudo代碼。當登錄成功時,我的登錄服務會發出事件,並在此時設置'pref'對象中的值。直到那時pref是一個空的對象 – SamSerious

回答

4

pref工廠返回的對象,

{ setPreference: setPreference, 
    currency: pref.currency, 
    name: pref.name, 
    formatTime: formatTime } 

currency分配和name未定義性質。由於undefined不是參考類型,因此currencyname將不會「看到」對象pref的任何更新。

我建議而不是引用pref對象是由工廠返回的對象的一部分屬性:現在

{ setPreference: setPreference, 
    prefs: pref, 
    formatTime: formatTime } 

,任何更新我們對pref將在prefs反映。請參閱該對象的屬性如下在你的控制器:

console.log(prefService.prefs.name) 

爲了在不改變引用,pref點,使用angular.copy()修改對象pref引用:

function setPreference(values){ 
    //pref = values; <<-- won't work, since pref will now reference another object 
    angular.copy(values,pref); 
} 

更新:爲了在name更改時自動更新視圖,建議將作爲示波器屬性的參考prefs保存爲:

$scope.prefs = prefService.prefs; 

然後在視圖/ HTML使用{{prefs.name}}

<p>Hello {{prefs.name}}!</p> 

更新plunker

+0

謝謝!我理解這個問題。現在我的服務方法已更新值,但是我的範圍屬性仍未更新。 '$ scope.name = prefService.prefs? prefService。prefs.name:null;''name'永遠不會在視圖中更新 – SamSerious

+0

@SamSerious,查看更新後的答案和更新的plunker。 –

+0

謝謝你,完美的作品!有一個問題,爲什麼它需要在範圍上?我假設它與摘要循環有關,但是在再次使用'$ scope.name'時應該已經計算了'prefService.prefs.name' – SamSerious