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 }

currencyおよびnameを未定義のプロパティに割り当てます。undefinedは参照型ではないため、currencyobjectへ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;

次に{{prefs.name}}、ビュー/HTML で使用します。

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

更新しましたplunker

于 2013-06-24T16:13:27.663 に答える