2016-03-31 13 views
2

... bir uzatıcı dahaHangi siparişler gözlemlenebilir uzantılar yürütüldü? o devletler <a href="http://knockoutjs.com/documentation/extenders.html" rel="nofollow">extending observables</a> için knockoutjs docs alt kısmında

Daha bir gözlenebilirin .extend yöntemine tek bir çağrıda uygulanabilir.

this.firstName = ko.observable(first).extend({ required: "Please enter a first name", logChange: "first name" }); 

Bu durumda, hem gerekli hem de logDeğiştirici genişleticiler gözlemlenebilirliğimize karşı yürütülür.

... Uzantıların hangi sırayla uygulanacağını bilmek istiyorum. Her zaman aynı sırayla mı çalışacak? Siparişi tanımlayan nedir?

+1

Olası kopya: http://stackoverflow.com/questions/20831840/multiple-extenders-in-knockout-js-not-working, en azından cevabı burada da geçerlidir. – nemesv

+1

Evet - kabul edilen cevap sorumu da yanıtlıyor: http://stackoverflow.com/a/20835989/665261 Teşekkürler! –

+0

Aslında, bence bu farklı bir soru ve bu cevap farklı sorulara cevap veriyor. Bu sorunun çaresi, yukarıda yapmadığınız uzatıcıları zincirlemektir. –

cevap

0

sırası önemliyse, Arayabileceğin extend birden çok kez:

söyleniyor
this.firstName = ko.observable(first) 
    .extend({ required: "Please enter a first name" }) 
    .extend({ logChange: "first name" }); 

, genellikle tanımlandı aynı sırada bir nesnenin özelliklerini işlemek tarayıcılar. Böylece orijinal yönteminiz bununla aynı etkiye sahip olacaktır.

4

sipariş JavaScript nesne özellikleri önce ES2015 için tanımlı bir sipariş çünkü, mevcut nakavt (bu yazının 3.4.0) 'de tanımlanmamış ve hatta ES2015 olarak, for-in ve Object.keys herhangi bir sipariş bilgisi olan. Hatta (

function objectForEach(obj, action) { 
    for (var prop in obj) { 
     if (obj.hasOwnProperty(prop)) { 
      action(prop, obj[prop]); 
     } 
    } 
} 

Yani, genişleticiler çalışacağı hiçbir tanımlanmış düzen vardır:

function applyExtenders(requestedExtenders) { 
    var target = this; 
    if (requestedExtenders) { 
     ko.utils.objectForEach(requestedExtenders, function(key, value) { 
      var extenderHandler = ko.extenders[key]; 
      if (typeof extenderHandler == 'function') { 
       target = extenderHandler(target, value) || target; 
      } 
     }); 
    } 
    return target; 
} 

Onun objectForEach fonksiyon for-in kullanır:

akım Nakavt böyle bu genişleticiler yoluyla döngüler ES2015) mevcut Nakavt'ta. Teoride yılında

, Knockout gelecekteki bir sürümü yerine yeni Object.getOwnPropertyNames kullanabilirsiniz:

function applyExtenders(requestedExtenders) { 
    var target = this; 
    if (requestedExtenders) { 
     Object.getOwnPropertyNames(requestedExtenders).forEach(function(key) { 
      var extenderHandler = ko.extenders[key]; 
      if (typeof extenderHandler == 'function') { 
       target = extenderHandler(target, requestedExtenders[key]) || target; 
      } 
     }); 
    } 
    return target; 
} 

getOwnPropertyNames saygı spec §9.1.12 listelenen JavaScript özelliklerinin yeniden tanımlanmış emir. Örneğinizde, required, daha sonra logChange olur, çünkü nesne başlatıcıları sözcüksel sırayla özellikler oluştururlar ve "kendi" özelliklerinin sırasına göre, hepsi sayısal olmayan ve Symbol s değil, oluşturma sırasıdır (ancak bkz. detaylar için spec).

İlgili konular

 İlgili konular