arkadaş devs!Tepki: AppStore dinleyicisi bir işlev olmalı
Egghead'deki eğiticiler sayesinde Flux/React içine kazıyorum. React'un hareket ettiğini duymuş olsam da, bu dersleri takip ederken React kütüphanesindeki bazı değişikliklerle karşılaştım.
Şimdiye kadar hepsini tamir edebildim. Şimdi, Mağaza ile ilgili bir tuğla duvara koştum. Öğretici olarak, kullanıcının alışveriş sepetine bir şeyler ekleyebileceği bir alışveriş sepeti yapıyorum. Bu karmaşık değil. Asıl eklenti çalışır, ancak yeniden oluşturma tetiklenmez.
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},
Yakalanmayan TypeError sonuçlanır: Aşağıdaki kodu (tam kod yanı aşağıda listelenecek) ilave hata veriyor dinleyici işlevi olmalıdır. Geri arama parametresi tanımlanmamıştır (yani sorunun nerede olduğu budur). Ancak, yeni React'ın çalışma şeklinden daha fazlasım olduğu için, problemi bulmakta zorlanıyorum. Aşağıdaki pasajı öğreticisindeki Store: Bu Egghead.io bir öğretici gelen kodu olduğunu
var AppStore = assign(EventEmitter.prototype, {
emitChange: function() {
this.emit(CHANGE_EVENT);
},
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},
removeChangeListener: function(callback) {
this.removeChangeListener(CHANGE_EVENT, callback);
},
getCart: function() {
return _cartItems;
},
getCatalog: function() {
return _catalog;
},
getCartTotals: function() {
return _cartTotals();
},
dispatcherIndex: AppDispatcher.register(function (payload) {
var action = payload.action;
switch(action.actionType) {
case AppConstants.ADD_ITEM:
_addItem(payload.action.item);
break;
case AppConstants.REMOVE_ITEM:
_removeItem(payload.action.index);
break;
case AppConstants.INCREASE_ITEM:
_increaseItem(payload.action.index);
break;
case AppConstants.DECREASE_ITEM:
_decreaseItem(payload.action.index);
break;
}
AppStore.emitChange();
return true;
})
});
not alın ve hiçbir-şekilde sahibi benim (ve onlar bu yüzden kaldıracaktır isterseniz kod adı geçen).
Daha fazla kod veya açıklama gerekirse, mecbur kaldığım için mutlu olurum!
sayesinde insanlar :)
DÜZENLEME 1: değiştirmek dinlemek gerekiyordu bileşeni değil yapar: Bana göre
var Cart = React.createClass({
getInitialState: function() {
return cartItems();
},
componentWillMount: function() {
debugger;
AppStore.addChangeListener(this.onChange);
},
componentDidMount: function() {
debugger;
AppStore.addChangeListener(this.handleChange);
},
handleChange: function() {
debugger;
this.forceUpdate();
},
_onChange: function() {
debugger;
this.setState(cartItems());
},
render: function() {
var total = 0;
var items = this.state.items.map(function (item, i) {
var subtotal = item.cost * item.qty;
total +=subtotal;
return (
<tr key={i}>
<td><RemoveFromCart index={i} /></td>
<td>{item.title}</td>
<td>{item.qty}</td>
<td>
<Increase index={i} />
<Decrease index={i} />
</td>
<td>${subtotal}</td>
</tr>
);
});
return (
<table className="table table-hover">
<thead>
<tr>
<th></th>
<th>Item</th>
<th>Qty</th>
<th></th>
<th>Subtotal</th>
</tr>
</thead>
<tbody>
{items}
</tbody>
<tfoot>
<tr>
<td colSpan="4" className="text-right">Total</td>
<td>${total}</td>
</tr>
</tfoot>
</table>
);
}
});
Sorunun küçük, çalışan bir örneğini verebilir misiniz? Ayrıca, kodu görmek için hata ayıklamayı denediniz mi * neden * niçin geri arama null? "AddChangeListener" öğesini nereden arıyorsun? Bir bileşeni var mıyım? – christopher
Yapabilirsem isterdim, ama 20'ish dosyalarından ve gerçek kodun telif hakkı sorunuyla ilgili konuşuyoruz (söz konusu kodun kopyalanması/dağıtılması için sınırların nerede bulunduğundan emin değilim). Temel olarak, 'Appstore.emitChange()' satırını tetikleyen '_addItem (payload.action.item) işlevi çağrılır. Bu da, 'addChangeListener: function (callback)' satırını tetikleyen emitChange: function() 'satırını tetikler. Doğal olarak, geri arama tanımsızdır .. Ama bu konuda React hakkında yeterli bilgi sahibi değilim:/ – Nickvda
"emitChange", 'addChangeListener' işlevini neden/nasıl? Yapmamalıydı. Etkinlik yayıldığında hangi işlev çağrılır? Kodunuzu doğru şekilde bağlayamadınız gibi görünüyor. Bunun React btw ile ilgisi yok. AddChangeListener’in nasıl çağrıldığını bilmiyorsak size gerçekten yardımcı olamayız. –