我有一个用户首选项工厂,用于保存用户首选项值。页面加载时为空。用户登录后,用户配置文件填满。 伪代码
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出厂返回值,而不是在控制器中更新。我如何使它工作?
答案 0 :(得分:4)
从pref
工厂返回的对象
{ setPreference: setPreference,
currency: pref.currency,
name: pref.name,
formatTime: formatTime }
将currency
和name
分配给未定义的属性。由于undefined
不是引用类型,currency
和name
不会“看到”对象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