1

newbを助けてください。アイムAngularJS 1.6.1、TypeScript、UI Bootstrap Modal:セッション記憶域に格納されているグローバル変数がモーダルによって更新されているのはなぜですか?

// Create Controller 
addChannel = (channel) => {    
     channel.QuotingChannelType = channel.QuotingChannelId;    
     console.log(this.$sessionStorage.QuoteTimes); 
     channel.QuoteTypes = this.$sessionStorage.QuoteTypes; 
     channel.QuoteTimes = this.$sessionStorage.QuoteTimes; 
     if (!this.myChannels) { this.myChannels = []; } 
     this.myChannels.push(channel);   
    }; 

:私はプロパティとしてグローバル変数の一部を使用するオブジェクトを作成するために、別のコントローラに別の方法を使用してい

//Global Controller 
saveGlobalSettings =() => { 
     this.$sessionStorage.QuoteTimes = this.quoteTimes; 
     this.$sessionStorage.QuoteTypes = this.quoteTypes; 
    }; 

:私はいくつかのグローバル変数を格納するためにngStorageを使用していますng-repeatを使用して、ブラウザにmyChannelsのオブジェクトを表示します。クリックされた、私はopenDialog()メソッドにオブジェクトを渡しているとき:

openPreferencesDialog = (channel) => { 
     var options: ng.ui.bootstrap.IModalSettings = { 
      templateUrl: 'app/form/templates/editChannelPreferences.html', 
      controller: 'EditDialogController', 
      controllerAs: '$ctrl', 
      resolve: { 
       channel:() => channel 
      } 
     };    
     this.$uibModal.open(options).result 
      .then(updatedChannel => console.log(updatedChannel));    
    }; 

予想通りダイアログが開きますが、私は変更を加えたとき、それはaddChannelconsole.logから見た($sessionStorageQuoteTimesQuoteTypes配列を更新しています)。したがって、作成された新しいオブジェクトには、最後に編集したオブジェクトのQuoteTimesQuoteTypesがあります。私は完全に困惑しています。私の最高の推測は、スコープチェーンの問題のいくつかの種類ですか?私が間違っていることは何か考えていますか?

UPDATE:次のようにJSON.parse(JSON.stringify(obj));を使用することにより、予想通り、私はそれを動作させることができました:

openPreferencesDialog = (obj, index) => {   
     var channel = JSON.parse(JSON.stringify(obj)); 
     var options: ng.ui.bootstrap.IModalSettings = { 
      templateUrl: 'app/form/templates/editChannelPreferences.html', 
      controller: 'EditDialogController', 
      controllerAs: '$ctrl', 
      resolve: { 
       channel:() => channel 
      } 
     };    
     this.$uibModal.open(options).result 
      .then(updatedChannel => 
      { 
       console.log(updatedChannel); 
       this.$sessionStorage.myChannels[index].QuoteTimes = updatedChannel.QuoteTimes; 
       this.$sessionStorage.myChannels[index].QuoteTypes = updatedChannel.QuoteTypes; 
       console.log(this.$sessionStorage.myChannels) 
      });    
    }; 

この作品、なぜ誰も説明できますか?

答えて

1

channelオブジェクトのquote ... membersがプリミティブ型でない場合は、通常の動作です。それらは参照型であるため、最後に編集されたチャネルオブジェクトと$ sessionstorageの両方が同じ参照をメモリ内に持っています。

関連する問題