2016-07-21 6 views
0

Я использую реагировать родной ящик https://github.com/root-two/react-native-drawerReact Native: нельзя использовать метод из «routeMapper»?

Я пытаюсь вызвать метод OpenDrawer(), передав переменную в NavigationBarRouteMapper. Я попробовал войти в систему NavigationBarRouteMapper, и он регистрирует переданную переменную правильно.

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> 
    ) 
    } 
    },... 

Почему может быть проблема: Но когда он используется внутри NavigationBarRouteMapper, нажав на кнопку Left Navigation «открытого ящика», это ничего не делать?

+0

Вы проверили журналы ошибок? Я предполагаю, что вы получите ошибку, такую ​​как 'Uncaught TypeError: не можете прочитать свойство 'open' of undefined' –

+0

@PatrickRoberts Да, это именно так! Почему это так и как я могу решить проблему? –

ответ

2

На вашем методе constructor() добавить следующее: this.openDrawer = this.openDrawer.bind(this);

Вы, вероятно, используя this на неверной области.

+0

Я пробовал это раньше, но все же он не активируется ... Он правильно регистрирует функцию openDrawer(), хотя - пробовал ее внутри функции LeftButton в NavigationBarRouteMapper. Все правильны, но настолько смущены, что не работают –

+0

Я мало знаю о NavigationBar, поэтому я ищу другие вещи. Я думаю, что ваш метод 'onPress' ничего не делает, должен быть' openDrawer}> 'для возврата метода или' {openDrawer()}}> 'выполнить его. – lalkmim

+0

Да !!! openDrawer() работал !!!! Спасибо большое. подчеркивали об этом весь день вчера и сегодня. Вы спаситель –

2

Существует общая путаница при работе с компонентами React и новым синтаксисом ES6 extends. Если вы используете React.createClass, он свяжет this со всеми вашими функциями, но при использовании подхода ES6 extends React.Component вам необходимо связать свои функции вручную.

Вы можете сделать это либо встроенный, используя

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

В качестве альтернативы, вы можете добавить в свой конструктор, после super():

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

Лично мне нравится этот подход, поскольку я нахожу этот код немного легче читать.

Для получения дополнительной информации о способе ES6, отметьте this link.

+0

Здравствуйте снова Kuf! Я попробовал второй подход, но он ничего не делает, когда я нажимаю левую кнопку навигации ... вроде бы я тоже не получаю никаких ошибок. Это просто не открывается. –

+0

и просто для подтверждения, вы имели в виду this.openDrawer = this.openDrawer.bind (this), правильно? –

+0

@JoKo да конечно .. скопирован из моего кода и забыл обновить. Я попробую ваш код позже и посмотрю, могу ли я добавить что-нибудь – Kuf

Смежные вопросы