2017-02-27 2 views
0

私はバックボーンと反応します。バックボーンのobject.offを反応クラスのメソッドコールバックで使用する

私は別のアプローチを試みていると、どうやらthis.updateのコンテキストがバックボーンによるピックアップ/アクセスされていない、backbone作品にoffメソッドを作ることができないし、それを削除することはできません。私はthis.updateを抽出し、MyStatic.update = function update() { // do stuff }のように、クラスは、関数がグローバル行う前に入れてテストしてoff方法は動作しますが、すぐに私はたぶん私は何かを明らかに不足しているが、私だsome.backbone.object.on('change:total_score', MyStatic.update.bind(this));

のようにクラス内のメソッドにthisをバインド動作を停止しますバックボーンの新機能で、コンポーネントwillComponentMountが実行されるとすぐにイベントを削除する必要があります。何か案は?

import React, {Component} from 'react'; 

class SomeClass extends Component { 
    componentWillMount() { 
    some.backbone.object.off('change:total_score', this.update); 
    some.backbone.object.on('change:total_score', this.update); 
    } 


    update() { 
    // do something 
    } 
} 

UPDATE:私は既に矢印異なる方法で機能し、コンテキストを結合して使用しよう

this.update = this.update.bind(この); //コンストラクタ内

const update =()=> this.update(); // offメソッドの前に

私が今行っていることは、バインドされていない静的関数を作成したので、参照を見つけてoffメソッドでイベントを削除して渡しています私のアプリケーション全体で既に宣言していたグローバルオブジェクトを介したインスタンス参照は、最もエレガントな方法ではなく、うまくいきます。もし誰かがより良い方法でそれを修正する方法を知っていればうまくいくでしょう。

import React, {Component} from 'react'; 

class SomeClass extends Component { 

    static myUpdate =() => { 
    const context = someGlobalStore.context; 
    context.update(); 
    } 

    componentWillMount() { 
    someGlobalStore.context = this; 
    some.backbone.object.off('change:total_score', SomeClass.myUpdate); 
    some.backbone.object.on('change:total_score', SomeClass.myUpdate); 
    } 

    update() { 
    // do something 
    } 
} 

答えて

0

関数をバインドするたびに、新しい関数が返されます。これは、元の関数または別の束縛された関数とは異なる参照を持っています。

私がお勧めするのは、コンストラクタで関数をバインドし、このようにcomponentWillMountで使用することです。

import React, {Component} from 'react'; 

class SomeClass extends Component { 
    constructor(props) { 
     super(props); 
     this.update = this.update.bind(this); 
    } 
    componentWillMount() { 
     const dataTable = this.connectData(); 
     this.setState({ 
      dataTable, 
     }); 

     some.backbone.object.off('change:total_score', this.update); 
     some.backbone.object.on('change:total_score', this.update); 
    } 


    update() { 
     // do something 
    } 
} 

また、バベルでes7パッケージを使用している場合は、クラス自体にarrow関数を定義することができ、bindをまったく使用する必要はありません。

+0

私はすでに提案してくれてありがとうございますが、何らかの理由でバックボーンが関数へのポインタを失うのは、バインドが適用されているときです。バックボーンがバックボーンコンテキスト内の関数にアクセスしようとしていると思います。最後にバインドされていない静的メソッドを作成し、 'store' /グローバル変数を介してクラスインスタンスのコンテキストを渡します。私はよりエレガントな方法ではないと思っていますが、それでもなぜバインドが自動的にバックボーンに影響するのか理解できません。 – ncubica

+0

矢印機能をバインド/使用すると、機能のコンテキストは変更されません。最初にコンポーネントがマウントされるのは、すでにイベントにアタッチされている関数ですか? – lavish

関連する問題