2016-10-16 27 views
0

私は、その外からJsonの内部にある関数を呼び出そうとしています。私はボタン "onClick"メソッドの "次の"機能をトリガーしたい。ここに私のコードです。私はonClick = {this.next}で呼び出そうとしましたが、このメソッドでは呼び出されません。他の関数の中にある関数を呼び出す

export default class PlayerLogic extends Component{ 

    componentDidMount() { 
     var self = this; 
     var player = videojs(this.refs.video, this.props.options).ready(function() { 
      self.player = this; 
      self.player.on('play', self.handlePlay); 
     }); 

     player.markers({ 
      onMarkerReached: function() { 
       player.pause(); 
      }, 

      next : function() { 
       // go to the next marker from current timestamp 
       console.log("reached") 
       var currentTime = player.currentTime(); 
       for (var i = 0; i < markersList.length; i++) { 
        var markerTime = setting.markerTip.time(markersList[i]); 
        if (markerTime > currentTime) { 
         player.currentTime(markerTime); 
         break; 
        } 
       } 
      } 
     }); 

    } 

    render() { 
     return (
      <div> 
       <video {... props}> 
        <source src={this.props.src} type={this.props.type} id={this.props.id}/> 
       </video> 
<button onClick={this.next}>Next</button> 

      </div>) 

    } 
}; 
+0

これがどのように見えますaリアクトエクステンション – Tibrogargan

答えて

0

あなたは、さらに以下のようにstateでそれをリファクタリングする必要があり、

export default class PlayerLogic extends Component{ 

constructor() { 
     super(); 
     this.state = { 
      player : {} 
     }; 
    } 

    componentDidMount() { 
     var self = this; 
     var player = videojs(this.refs.video, this.props.options).ready(function() { 
      self.player = this; 
      self.player.on('play', self.handlePlay); 
     }); 

     player.markers({ 
      onMarkerReached: function() { 
       player.pause(); 
      }, 

      next : function() { 
       // go to the next marker from current timestamp 
       console.log("reached") 
       var currentTime = player.currentTime(); 
       for (var i = 0; i < markersList.length; i++) { 
        var markerTime = setting.markerTip.time(markersList[i]); 
        if (markerTime > currentTime) { 
         player.currentTime(markerTime); 
         break; 
        } 
       } 
      } 
     }); 

     this.setState({ player: player }); 
    } 

    next() { 
     this.state.player.next(); 
    } 

    render() { 
     return (
      <div> 
       <video {... props}> 
        <source src={this.props.src} type={this.props.type} id={this.props.id}/> 
       </video> 
<button onClick={this.next.bind(this)}>Next</button> 
+0

ありがとうございました。小さな変化で私のために働いた。私はthis.state.player.markers.next()を呼び出さなければならなかった。 insted of this.state.player.next() – ApurvG

+0

他のコンポーネントにボタンがあり、そのボタンで同じことをしたい場合はどうすればいいですか?どのような変更が必要ですか? – ApurvG

+0

pubsubは、「https://github.com/mroderick/PubSubJS」のように相互に関連していない場合に使用できます。詳細については、「https://ctheu.com/2015/02/12/how-to-communicate-between-react-components/」を参照してください。 – Aruna

0

私はあなたがリアクトを使用していることを理解しています。これは.jsxですか、.tsxですか?あなたはなぜ矢印機能を使用しないのですか?それはES6の機能です。あなたはこれを行うことができます。

next:() => { 
    ... 
} 

主に、すべてのブラウザがES6でサポートされています。あなたは、ブラウザのコンソールでこれを試すことができます。

let foo =() => 5; 
console.log(foo()); 

それとも、バベルを使用してバックES5にコードをコンパイルすることができます

https://babeljs.io/docs/learn-es2015/

ここでの問題は、あなたがfunctionを使用する場合は、Javascriptがそれを仮定しますですthis.nextはあなたのボタンnextメソッドであり、プレーヤーはnextメソッドではありません。あなたが行ったように機能() => {}thisを保持します矢印:

var self = this; 
var callback = function() { 
    self.doSomethingHere(); 
} 

var player = video(...).ready(callback); 

をので、あなただけにあります。

let callback =() => { 
    this.doSomethingHere(); 
} 
+0

"なぜあなたは矢の機能を使わないのですか" - どうしてですか?このコードでは実際的な違いはありません。 – Quentin

+0

「ブラウザコンソールでこれを試すことができます」 - 質問とは何が関係していますか? – Quentin

関連する問題