2016-07-21 10 views
0

Ich verwende reagieren nativer Schublade https://github.com/root-two/react-native-drawerReact Native: Kann keine Methode von 'routeMapper' verwendet werden?

Ich versuche, die Methode openDrawer(), indem in Variable in NavigationBarRouteMapper zu nennen. Ich habe versucht, in NavigationBarRouteMapper zu loggen, und es protokolliert die korrekt übergebene Variable. Aber wenn es im Inneren des NavigationBarRouteMapper verwendet, durch die linke Navigationstaste von ‚Open Schublade‘ klicken, tut es nichts:

class drawerPractice extends Component { 
... 

    openDrawer(){ 
    this._drawer.open() 
    } 

    render() { 
    return (
    <Drawer 
    content={<DrawerPanel/>} 
    openDrawerOffset={100} 
    ref={(ref) => this._drawer = ref} 
    type='static' 
    tweenHandler={Drawer.tweenPresets.parallax} 
    > 
     <Navigator 
      configureScene={this.configureScene} 
      initialRoute={{name: 'Start', component: Start}} 
      renderScene={this.renderScene} 
      style={styles.container} 
      navigationBar={ 
      <Navigator.NavigationBar 
       style={styles.navBar} 
       routeMapper={NavigationBarRouteMapper(this.openDrawer)} 
      /> 
      } 
     /> 
    </Drawer> 
    ); 
    } 
} 

var NavigationBarRouteMapper = openDrawer => ({ 
    LeftButton(route, navigator, index, navState){ 
     return(
      <TouchableHighlight onPress={()=>{openDrawer}}> 
       <Text>Open Menu</Text> 
      </TouchableHighlight> 
    ) 
    } 
    },... 

Warum kann das Problem sein?

+0

Haben Sie die Fehlerprotokolle überprüft? Meine Vermutung ist, dass Sie einen Fehler erhalten würden wie 'Uncaught TypeError: Kann die Eigenschaft 'open' von undefined nicht lesen. –

+0

@PatrickRoberts Ja, genau das ist es! Warum tut es so und wie kann ich über die Auflösung gehen? –

Antwort

2

Auf Ihrer constructor() Methode hinzufügen: this.openDrawer = this.openDrawer.bind(this);

Sie this auf dem falschen Umfang wahrscheinlich verwenden.

+0

Ich habe es vorher ausprobiert, aber es wird immer noch nicht aktiviert ... Es ist richtig, die openDrawer() -Funktion zu protokollieren - versuchte es in der LeftButton-Funktion in NavigationBarRouteMapper. Jeder ist richtig, aber so verwirrt, warum es nicht funktioniert –

+0

Ich weiß nicht viel über NavigationBar, also suche ich nach anderen Dingen. Ich denke, Ihre 'onPress' Methode tut nichts, sollte' openDrawer}> 'um die Methode zurückzugeben oder' {openDrawer()}}> 'um es auszuführen. – lalkmim

+0

Ja !!! openDrawer() hat funktioniert !!!! ich danke dir sehr. habe gestern und heute den ganzen Tag darüber gestresst. Sie der Retter –

2

Beim Arbeiten mit React-Komponenten und der neuen Syntax ES6 extends gibt es eine häufige Verwechslung. Wenn Sie React.createClass verwenden, bindet es this an alle Ihre Funktionen, aber wenn Sie den ES6-Ansatz von extends React.Component verwenden, müssen Sie Ihre Funktionen manuell binden.

Sie können es entweder inline mit

<TouchableHighlight onPress={()=>{this.openDrawer.bind(this)}}> 

Alternativ können Sie zu Ihrem Konstruktor hinzufügen, nach super():

this.openDrawer = this.openDrawer.bind(this); 

Ich persönlich mag diesen Ansatz als ich diesen Code ein bisschen einfacher finden lesen.

Weitere Informationen zur ES6-Methode finden Sie unter this link.

+0

Hallo nochmal Kuf! Ich habe den zweiten Ansatz versucht, aber es tut nichts, wenn ich auf den linken Navigationsknopf klicke ... wie ich auch keine Fehler bekomme. Es öffnet sich einfach nicht. –

+0

und nur zur Bestätigung, Sie meinten dies.openDrawer = this.openDrawer.bind (this), richtig? –

+0

@JoKo Ja sicher .. kopiert von meinem Code und vergessen zu aktualisieren. Ich werde Ihren Code später versuchen und sehen, ob ich etwas hinzufügen kann – Kuf