2011-09-26 3 views
5

Bağımlı bir gözlemlenebilir üzerinde bir commit()/peek() tipi işlevler kullanan Ko'nun özel bir genişletilmiş sürümünü kullanıyorum, böylece verileri yalnızca veritabanına bağlıysa (Tamam) formda saklıyorum ve iptal edildi.Neden onay kutusu tıklatıldığında onay kutusu yalnızca işaretlendiğinde yazılır?

Sorun şu ki, bir onay kutusunu işaretlediğimde, yazma işlevi korunan gözlenebilirde doğru çağrılır. Ancak, onay kutusunun işaretini kaldırırsam, yazma işlevi çağrılmaz, bu nedenle model MVC denetleyicime gönderildiğinde, onay kutusu boolean hala TRUE olur.

Nakavt neden FALSE değerini yazmıyor?

KODU İLE GÜNCELLEME SORU:

gösteri yapmasını bu JsFiddle bakın: http://jsfiddle.net/b2Qu2/3/

Minör konu demo ile 1 diğer sorun olduğunu

Not - için bazı nedenlerden dolayı, onay kutusunu işaretlediğimde/işaretini kaldırdığımda, bağımlı bir değere bağımlı olsa bile, göz atılan değer UI'de güncellenmez. Yine de 'peek' düğmesine tıklayarak değeri gözden geçirebilirsiniz.

Başlıca Sayı

sorun yeniden oluşturmak için:

1) Click 'peek' button: Shows FALSE - CORRECT 

2) Check IsAdmin checkbox 

3) Click 'peek' again: Shows TRUE - CORRECT 

4) Uncheck IsAdmin 

5) Click 'peek' again: SHOWS TRUE - INCORRECT!! 

Örnek senaryo

bir iletişim düşünün Yönetici kullanıcısı için bir onay kutusu ile gösterilir. Sadece 1 yönetici kullanıcısı ayarlanabilir ve bir yönetici kullanıcısı varsa sunucu geçerli/geçersiz yanıt verir. Kullanıcı daha sonra onay kutusunu işaretler, ancak şimdi viewmodel onay kutusunun HER ZAMAN doğru olduğunu düşünüyor? Korumalı Olasılık kullanmanın nedeni, sunucu yanıtı başarılı olursa, commit() yöntemi çağrılır, böylece her şey kullanıcı arabiriminde kalıcıdır. Kullanıcı diyaloğu iptal ederse veya bir hata oluşursa, orijinal değerlerin üzerine yazılmaz.

+0

Kodunuzun daha paylaşabilir miyim, bildiğim kadarıyla, bağlı olduğu nasıl olduğu/kullanıldığı? –

+0

@RP Niemeyer - Sorumu bir kodla güncelledim. Bu biriyle mücadele! – jaffa

cevap

3

Yazımın yalnızca bir değerde işten çıkarılmasının nedeni, yalnızca bunun neye bağlı olduğunu farklı bir değer yazması gerektiğine inandığı zaman tetikleyeceğidir. Bu yüzden korumalı korumanızın gerçek değeri değişmiyor. Doğruysa ve bunu true olarak ayarladığınızda, yazım doğru değere sahip olduğuna inandığı için yazmaz.

muhtemelen biraz o kadar değiştirip böyle bir şey kullanırsınız:

ko.protectedObservable = function (initialValue) { 
    //private variables 
    var _actual = ko.observable(initialValue), 
     _temp = ko.observable(initialValue); 

    //access to temp value 
    _actual.temp = _temp; 

    //commit the temporary value to our observable, if it is different 
    _actual.commit = function() {   
     if (_temp() !== _actual()) { 
      _actual(_temp()); 
     } 
    }; 

    //notify subscribers to update their value with the original 
    _actual.reset = function() { 
     _actual.valueHasMutated(); 
     _temp(_actual()); 
    }; 

    return _actual; 
}; 

Eğer field1 veya field1.temp karşı bağlayabilir bu sürümü ile. Bir göze bile ihtiyacınız yok, çünkü hem sıcaklık hem de gerçek değerler gözlenebilir.

Bu şuna benzer: http://jsfiddle.net/rniemeyer/BwDYE/

+0

Merhaba, kod örneği için teşekkürler.Tüm kod tabanım, ilk kemanıma dayanarak korumalıObservable'ı temel alıyor, bu yüzden davranışını/bağlaçlarını değiştirmek istediğimden emin değilim. Modeldeki bağlamalar .temps yerine asıl korumalı korumayı kullanır. Örnegin, iletisim kutusunun iptal edilmesi/sunucu hatasi ve basariyla() basarili olmasi durumunda reset() yöntemini temel alir. Modelim tersine dayanıyor, kullanıcı iptal ederse veya sunucu hatası sunucuya göndermek için göz atılan değerler kullanıldığında hiçbir şey yapmaz. Sunucu başarılı olursa, commit(). Mmm, bunu nasıl yapacağını bilmiyorum ... – jaffa

+1

Eminim nasıl farklı olduğunu takip ediyorum. Sadece herşeyi "senin alanın" yerine "uzayını yap. Aynı şekilde çalışmalı. Belki senaryoda nasıl işe yaramadığını daha iyi anlamama yardım edebilirsin? Uygun bir alternatifle gelmekten mutluluk duyarım. –

+1

Onay kutusunun onaylanabilir değeri, orijinal değerinden değiştirilip değiştirilmediğine bakılmaksızın her zaman yazıldığından emin olmanın bir yolu var mı? Görünüşe göre sorun bu ve orijinal cevabınızla bağlantılı. Hata ayıklama ifadelerini orijinal kodumdaki yazma işlevine koydum ve yalnızca onay kutusu değeri, kayıtlı değerinin güncelleştirilmemesi nedeniyle iyi olmayan orijinal değerinin tersi olduğunda çağrılır. Bu düzeltilebilirse, tüm görünümlerimi .temps ile değiştirmem gerekmeyecek. Umarım bu mantıklıdır! En iyi yolun ne olduğunu düşündüğünüzü bana bildirin. – jaffa