Angular:工厂模型中的更新不会反映在控制器中

时间:2013-06-24 07:49:15

标签: javascript angularjs

我有一个用户首选项工厂,用于保存用户首选项值。页面加载时为空。用户登录后,用户配置文件填满。 伪代码

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 个答案:

答案 0 :(得分:4)

pref工厂返回的对象

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

currencyname分配给未定义的属性。由于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