2016-03-31 19 views
0

'daki yönergeden önce değiştirildi Modelimi iki farklı ViewModel'de kullanmam gerektiğinden, Modelimi ViewModel'imden ayırmaya çalışıyorum. Yani ben bu denedim:Nakavt: context 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'}); 
} 

nasılsa, ilk console.log içinde, ben "Jean" itme, tarayıcıda, değişken "test" vardır ve doğru bir şekilde hatta i evvel true olarak ayarlanır aslında JS'ye bunu yapmasını söyle. Bu nasıl mümkün olabilir ? Ve endişelerimi doğru şekilde ayırıyor muyum? the documentation itibaren

cevap

0

, hala bir referans değil, zamanda bir anlık görüntü. context'u değiştirdiğinizde, hata ayıklayıcısında hangi referansa baktığınız önemli değil, hepsi aynı olacak. Bir anda onu görmek istiyorsanız onu statik (veya bir kesme noktasına yerleştirilmiş) bir şeye dönüştürmeniz gerekir.

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

:

değiştiğini üzeredir önce gözlemlenebilir değerinin bildirilmesini istiyorsanız, beforeChange olaya abone olabilirsiniz.

Sen bu şekilde deneyebilirsiniz: konsol (Açmak ve içeriğini bakmak için bir oka tıklayarak) bir nesneye başvurur zaman

ConversationManager.conversations.subscribe(function(context){ 
    // ... 
}, null, "beforeChange"); 
İlgili konular