2017-03-17 33 views
1

"this"内の何かをナビゲータレンダリング関数内から変更する関数を呼び出そうとしています。関数内で関数を呼び出すと、これは未定義の "this"が返されます。

だから私のレンダリング()関数は次のようになります。

renderScene(route, navigator) { 
if(route.name === 'timetable') { 
    return (
    <View style={{flex: 1}}> 
    <Content> 
    <ScrollView 
     horizontal={true} 
     ref='ScrollView' 
     pagingEnabled={true} 
     showsHorizontalScrollIndicator={false} 
     onScroll={this._onScroll.bind(this)} 
    > 
    <View style={{width: this.state.width}}> 
    <Timetable day='Ponedeljek' date='6.3.2017' /> 
    </View> 
    <View style={{width: this.state.width}}> 
    <Timetable day='Torek' date='7.3.2017' /> 
    </View> 
    </ScrollView> 
    <PageControlIOS 
     currentPage={this.state.currentPage} 
     numberOfPages={2} 
     pageIndicatorTintColor="grey" 
     currentPageIndicatorTintColor="#ff3b30" 
     style={{margin: -10}} 
     onValueChange={this._onPageControlValueChange.bind(this)} 
    /> 
    </Content> 
    </View> 
) 
}else if (route.name === 'allSubstitutions') { 
    return (
    <AllSubstitutions navigator={navigator}/> 
) 
} 
} 

からonValueChange機能は次のようになりますどの呼び出されたときに問題が起こる:

render() { 
return(
    <Navigator 
    ref='Navigator' 
    initialRoute={{name: 'timetable'}} 
    renderScene={this.renderScene.bind(this)} 
    /> 
); 
} 

これは私のrenderScene機能であります:

私が得るエラーは「未定義はオブジェクトではありませんs.refs.ScrollView.scrollResponderScrollTo ')。

render()関数の内容をrenderScene()の内容に置き換えるだけで、意図したとおりに動作します。

何が起こっているのか分かっていれば、私はこのソリューションをお聞きしたいと思います。

+2

は、コンポーネントのコンストラクタでイベントハンドラを結合すなわち 'this._onPageControlValueChange = this._onPageControlValueChange.bind(この)' – colti

+2

をお試しくださいエラーは 'this'が定義されていないと言っているわけではありません。 'this.refs.ScrollView'は未定義です。 ( 'this'が未定義の場合、エラーは' this.refs'を評価しています)。 –

+0

@coltiはまったく役に立ちません。同じエラー – user2724677

答えて

3

私はこれがあなたのrefScrollViewコンポーネントで定義した方法に問題があるようです。代わりに、このような何かをやってみてください。

<ScrollView 
    ref={(scrollView) => { this.scrollView = scrollView; }} 

、その後

_onPageControlValueChange(currentPage) { 
    this.scrollView.scrollResponderScrollTo({x: this.state.width * currentPage, y: 0, animated: true}) 
    } 
+0

'{this.scrollView = input; } ''のために '{this.scrollView = scrollView; } '。しかしそれは良い答えです。 –

+0

これは問題を解決しました、ありがとうございます。 – user2724677

+0

それを指摘していただきありがとうございます@ FacundoLaRocca – elevine

関連する問題