2016-03-31 2 views
0

2つの異なるViewModelでモデルが必要なので、私のモデルを私のViewModelから分離しようとしています。だから私はこれにしようとしました:ノックアウト:observable.subscribeの命令の前に文脈が変更されました

var ConversationManager = { 
    conversations: ko.observableArray([ 
     {id: 3, receiver:'Toto'} 
    ]) 
}; 

function ConversationDialogViewModel(){ 
    var self = this; 

    ConversationManager.conversations.subscribe(function(context){ 
     console.log('Before :', context); // context.test == true ??? 

     for(var i = 0; i < context.length; i++){ 
      if(context[i].id % 2 == 0 && !context[i].test){ 
       console.log('Insertion Called'); 
       context[i].test = true; 
      } 
     } 
     console.log('After :', context); 
    }); 

    ConversationManager.conversations.push({id: 4, receiver:'Jean'}); 
    ConversationManager.conversations.push({id: 5, receiver:'Paul'}); 
    ConversationManager.conversations.push({id: 6, receiver:'Bleu'}); 
} 

どういうわけか、最初にconsole.logで、私は「ジャン」を押すと、ブラウザでは、変数「テスト」は存在し、正しくも、私の前にtrueに設定されています実際にJSにそれをさせるよう伝えます。そんなことがあるものか ? そして、問題を正しく区別していますか?

答えて

0

コンソールは(あなたがそれを開くために矢印をクリックし、その内容を見ることができます)オブジェクトを参照するとき、それはまだ参照ではなく、時間内のスナップショット。 contextを変更すると、デバッガでどの参照が表示されているかは関係ありませんが、すべて同じになります。ある時点でそれを見たい場合は、静的なもの(またはブレークポイントに入れるもの)に変換する必要があります。

var ConversationManager = { 
 
    conversations: ko.observableArray([ 
 
     {id: 3, receiver:'Toto'} 
 
    ]) 
 
}; 
 

 
function ConversationDialogViewModel(){ 
 
    var self = this; 
 

 
    ConversationManager.conversations.subscribe(function(context){ 
 
     console.log('Before :', JSON.stringify(context)); // context.test == true ??? 
 

 
     for(var i = 0; i < context.length; i++){ 
 
      if(context[i].id % 2 == 0 && !context[i].test){ 
 
       console.log('Insertion Called'); 
 
       context[i].test = true; 
 
      } 
 
     } 
 
     console.log('After :', JSON.stringify(context)); 
 
    }); 
 

 
    ConversationManager.conversations.push({id: 4, receiver:'Jean'}); 
 
    ConversationManager.conversations.push({id: 5, receiver:'Paul'}); 
 
    ConversationManager.conversations.push({id: 6, receiver:'Bleu'}); 
 
} 
 

 
new ConversationDialogViewModel();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

0

the documentationから:

あなたは変更されようとしている前に観測可能の値が通知されるようにしたい場合は、beforeChangeイベントをサブスクライブすることができます。

あなたはそれをこのように試みることができる:

ConversationManager.conversations.subscribe(function(context){ 
    // ... 
}, null, "beforeChange"); 
関連する問題