2016-10-07 8 views
0

問題は次のとおりです。どのようにして登録を解除するリスナーを見つけることができますか?

コールバックの配列でリスナーを取得しました。それらは次のようになります。

static listeners = []; 

これらは、配列の項目を追加および削除するjsファイルです。

static items = []; 
static listeners = []; 

static add(item) { 
    this.items.push(item); 
    this.listeners.forEach((callback) => callback()); 
}; 

static remove(item) { 
    var index = this.items.indexOf(item); 
    this.items.splice(index, 1); 
    this.listeners.forEach((callback) => callback()); 

}; 

static register(callback) { 
    this.listeners.push(callback); 
}; 

状態を設定して配列が変更され、再描画されるときにコンポーネントに通知させたいと考えています。

constructor() { 
    super(); 

    this.state = { 
     items: ShoppingCartStore.items 
    }; 
} 

componentWillMount(){ 
    ShoppingCartStore.register(this.refresh.bind(this)); 
} 

componentWillUnmount(){ 
    ShoppingCartStore.removeEventListener(?, ?); 
} 

refresh() { 
    this.setState({items: ShoppingCartStore.items}) 
} 

render() { 
    return (
     <div> 
      <h1>Shopping Cart</h1> 
      <table className="pure-table"> 
       <thead> 
        <tr> 
         <td>No</td> 
         <td>Item</td> 
         <td>Size</td> 
         <td>Price</td> 
         <td></td> 
        </tr> 
       </thead> 
       <tbody> 
        {this.state.items.map((item, i) => <ShoppingCartRow key={i} index={i} item={item}/>) } 
        <ShoppingCartSumRow /> 
       </tbody> 
      </table> 
     </div> 
    ); 
} 

他のコンポーネントもこのリスナーの配列をリッスンします。
どのようにリスナーを登録解除する必要があるのですか?
リスナーの登録を解除する必要があります。これは、顧客が選択した項目がメインページに戻り、反応がアンマウントされたコンポーネントに対してsetStateできないためです。
任意の入力のためのおかげで、私はあなたが登録に渡すコールバック関数への参照に保つことができ、私の悪い英語

+0

'removeEventListener'コードはどこにありますか?通常、(いくつかのフレームワーク/レデューサー/状態マネージャで) 'register' /' subscribe'関数は、例えばreduxを使って 'deregister'関数を返します:https://github.com/reactjs/redux/blob/master/docs/ api/Store.md#subscribelistener –

+0

私はjsがそうするための標準的な機能を持っていると思った。しかし、あなたの質問に答えるためにremoveEventListenerのコードはありません。私はこのapiを見つけました。[リンク]:(https://developer.mozilla.org/de/docs/Web/API/EventTarget/removeEventListener)また、私は彼らがプロジェクトの中にいるので、もっと多くのフレームワークを使用することはできません。瞬間 – venter

答えて

0

をお詫び申し上げます:

var callbackReference; 
componentWillMount(){ 
    callbackReference = this.refresh.bind(this); 
    ShoppingCartStore.register(callbackReference); 
} 

をそして、あなたはこのようremoveEventListener関数を書くことができます:

static removeEventListener(reference){ 
    var index = this.listeners.indexOf(reference); 
    if(index != -1){ 
     this.listeners.splice(index, 1); 
    } 
} 

そして、ここでは、あなたがそれを呼ぶだろうかです:

componentWillUnmount(){ 
    ShoppingCartStore.removeEventListener(callbackReference); 
} 
+0

ありがとう、これは完璧に動作します! – venter

+0

@venter私は、幸運を助けることができてうれしいです。 – Titus

関連する問題