2016-10-16 82 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

這看起來像一個反應擴展 – 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

我明白你正在使用React,對!這是.jsx還是.tsx?爲什麼你不使用箭頭功能。這是一個ES6功能。您可以這樣做:

next:() => { 
    ... 
} 

大多數情況下,所有瀏覽器都支持ES6。您可以在瀏覽器控制檯試試這個:

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

,也可以使用通天編譯代碼回ES5:

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

這裏的問題是,當你使用function,JavaScript的假設this.next是您的按鈕next方法,而不是您的播放器next方法。 Arrow功能() => {}將保留this像你一樣:

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

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

所以你就必須:

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

「爲什麼你不使用箭頭功能」 - 爲什麼他們應該?這段代碼沒有實際的區別。 – Quentin

+0

「您可以在您的瀏覽器控制檯中試用此功能」 - 這與問題有什麼關係? – Quentin

相關問題