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

4

1 回答 1

4

pref工厂返回的对象,

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

分配currencyname给未定义的属性。由于undefined不是引用类型,currency因此name不会“看到”对 object 的任何更新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;

然后{{prefs.name}}在视图/HTML中使用:

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

更新plunker

于 2013-06-24T16:13:27.663 回答