2013-10-21 9 views
5

Şu anda iki Nakavt uzantısı işlevim var. Biri Gözlemlenebilir'e üye eklerken, diğeri okuma ve yazma işlemlerini durdurur.Knockout uzantısında oluşturulan özel özellikleri korumak için iyi bir desen nedir?

Uzantı yöntemlerini birleştirirken, uygulama sırasının istenmeyen bir etkisi vardır.

Aşağıdaki Basitleştirilmiş kod örnekleri. Sayısal yöntemle ben biçimlendirilmiş üyesi için kontrol edin ve yeni bilgisayarlı atamak ama ben diğer metot bilgisi vermek istemiyoruz olabilir yılında

ko.extenders.format = function(target) { 
    var result = ko.computed(function(){ 
     return "$" + target(); 
    }); 

    target.formatted = result; 

    return target; 
}; 

ko.extenders.numeric = function(target, precision) { 
    var result = ko.computed({ 
     read: function() { 
      var current = parseFloat(target()); 
      return current.toFixed(precision); 
     }, 
     write: function(newValue) { 
      newValue = parseFloat(newValue); 
      target(newValue.toFixed(precision)); 
     } 
    }); 

    return result; 
}; 

. Gözlemlenebilir veya uzantılardan daha fazla üye eklemeye karar verirseniz, bu özellik devam ettirilemez.

if(target.hasOwnProperty("formatted")){ 
    result.formatted = target.formatted; 
} 

Heres hasOwnProperty düzeltmesi olmadan bir keman. http://jsfiddle.net/gs5JM/2/

MyValue4 - Biçim: genişletme uygulamasının sırasına ve biçimlendirilmiş öğenin kaybına bağlı olarak boş olduğuna dikkat edin.

Aynı sonuca ulaşmak ve kodu daha esnek hale getirmek için daha iyi bir model var mı?

cevap

1

Sorun, format genişleticinizin orijinal gözlemlenebilir olması ve numeric'un yeni bir tane oluşturmasıdır. Yani format ve numeric tamamen farklı gözlenebilirlerle çalışır. Her iki durumda da orijinal gözlemlenebilir dönmek için düşünmelisiniz.

ko.extenders.numeric = function(target, precision) { 

    ko.computed(function(){ 
     var current = parseFloat(target()); 
     target(isNaN(current) ? 0 : current.toFixed(precision)); 
    }); 

    return target; 
}; 

Anonim computed hemen değerlendirmeyle target değer değişikliklere ilişkin bir abonelik oluşturulur:

senin numeric bu şekilde yeniden yazmak istiyorum. Değerlendirme işlevi, bir değeri ayrıştırmaya çalışacak ve gözlemlenen hedefe sayısallaştırılmış sayısal değeri yeniden atayacaktır.

http://jsfiddle.net/gs5JM/3/

Not: You should not care about possible circular dependency because KO will not re-evaluate computed while it's already evaluating.

+0

Yanıt için teşekkürler. Anonim bir ko.computed'in bu şekilde çalışacağının farkında değildim, ama mantıklı. –

+0

Bu, bir yazma yöntemi ile gözlenebilir ve hesaplanmış alanlar için harika çalışır, ancak yalnızca bir okuma yöntemi ile hesaplandığında başarısız olur. İlk sayısal genişleticide hem okuma hem de yazma işlevini ekledim, böylece her iki senaryoda da kullanabildim. Yazılabilir bir gözlemlenebilir değilse bir öneriniz var mı? –

+0

Salt okunur gözlemciler için bir genişleticiye ihtiyaç duyduğunuzda çok garip bir senaryo olacaktır. Ayrıntıları açıklar mısınız? –

İlgili konular