2012-12-04 17 views
6

Modelimde eşzamansız olarak yüklenmiş bir özellik var. Yüklendikten sonra başka bir model özelliği üretmesini istiyorum.Sadece bir kez ateşlenen devre dışı gözlemlenebilir abonelik nasıl oluşturulur?

İlk özellik değişikliklerinden sonra tetiklenebilecek, 2. özelliği oluşturan ve sonra da elden çıkarılacak aboneliği düşündüm - Aboneliği kendi içinden nasıl yok edebilirim bilmiyorum.

Gözlemlenebilir özellik değişikliklerinden sonra bir defalık olay tetikleme yolu var mı?

cevap

0

Sen bastırmak için bir genişletici yazabilirsiniz tüm ama ilk atış:

ko.extenders.fireOnce= function(target) { 
    var fired=false; 
    var result = ko.computed({ 
     read: target, 
     write: function(newValue) { 
      var current = target(); 
      if (newValue!== current && !fired) { 
       fired=true; 
       target(newValue); 
      } 
     } 
    }); 
    result(target()); 
    return result; 
}; 
sonra

aşağıdaki gibi kullanın:

var myObservable = ko.Observable(blah).extend({fireOnce:null}); 
+0

açığa konusunda önerilere açık 'changeOnce', ilk dışındaki tüm değer değişiklikler dikkate alınmaz çünkü. – blazkovicz

+0

@blazkovicz ... ve bu bir downvote için temel mi? – spender

+2

evet, çünkü soru abonelikle ilgiliydi, thast bir kez patladı ve bir kere değiştiğini gözlemlediniz. Bunlar iki derece farklı şeyler. – blazkovicz

21

sadece kendisine referans oluşturmak kendi içinde gelen abonelik uzaklaştırılmaları:

var subscription = yourObservable.subscribe(function (newValue) { 
    ... 
    subsription.dispose(); 
}); 

Bu kodu her seferinde yazmak istemezseniz, göstergeyi genişletebilirsiniz. Yeni yöntem ile le:

ko.subscribable.fn.subscribeOnce = function (handler, owner, eventName) { 
    var subscription = this.subscribe(function (newValue) { 
     subscription.dispose(); 
     handler(newValue); 
    }, owner, eventName); 
    return subscription; 
}; 

... 

// usage 
var subscription = yourObservable.subsribeOnce(yourHandler); 

Ve yok' o ateş değildi durumda bileşen elden çıkarma abonelik elden unutmayın. Biri kullanabilirsiniz

0

Biz böyle bir çözüm ile sona erdi ...

const subscription = observable.subscribe(() => { 
    subscription.dispose(); 
    doStuff(settings); 
}); 

Umut.

0

@blazkovicz cevap gerekçe olarak, subscribeOnce sonunda yeni bir değerle çözülmesi bir Promise geri dönebilirler. subscription nesne ;-) Bu genişletici adlı olmalıdır

ko.subscribable.fn.subscribeOnce = function (handler, owner, eventName) { 
    var subscribable = this; 
    var subscription; 
    return new Promise(function(resolve) { 
     subscription = subscribable.subscribe(resolve, owner, eventName); 
    }).then(function(newValue) { 
     subscription.dispose(); 
     handler && handler(newValue); 
     return newValue; 
    }); 
}; 

// usage 
yourObservable.subscribeOnce().then(function(newValue) { 
    ... 
}); 
İlgili konular