Dva: 如何在router.js里获取model?

Created on 21 Apr 2017  ·  2Comments  ·  Source: dvajs/dva

import { connect } from 'dva';
import React from 'react'
import { Router } from 'dva/router'
import App from './routes/app'

const cached = {}
const registerModel = (app, model) => {
  if (!cached[model.namespace]) {
    app.model(model)
    cached[model.namespace] = 1
  }
}

function router ({ history, app }) {
  const routes = [
    {
      path: '/',
      component: App,
      onEnter(nextState, replace){
        if (app.user.rebate_level_name && nextState.location.pathname === '/users/rebate_histories') {
          replace('/error')
        }
      },
      getIndexRoute(nextState, cb) {
        require.ensure([], require => {
          registerModel(app, require('./models/dashboard'))
          cb(null, { component: require('./routes/dashboard') })
        }, 'dashboard')
      },
      childRoutes: [
        {
          path: 'users/out_money',
          name: 'out_money',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              // registerModel(app, require('./models/out_money'))
              cb(null, require('./routes/users/OutMoney'))
            }, 'out_money')
          }
        },
        {
          path: 'users/infomation',
          name: 'infomation',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              // registerModel(app, require('./models/infomation'))
              cb(null, require('./routes/Infomation.js'))
            }, 'infomation')
          }
        },
        {
          path: 'users/customer_relation',
          name: 'customer_relation',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              // registerModel(app, require('./models/out_money'))
              cb(null, require('./routes/users/CustomerRelation.js'))
            }, 'customer_relation')
          }
        },
        {
          path: 'dashboard',
          name: 'dashboard',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              registerModel(app, require('./models/dashboard'))
              cb(null, require('./routes/dashboard'))
            }, 'dashboard')
          }
        },
        {
          path: 'users/rebate_histories',
          name: 'users/rebate_histories',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              registerModel(app, require('./models/rebate_histories'))
              cb(null, require('./routes/users/rebate_histories'))
            }, 'rebate_histories')
          }
        },
        {
          path: 'users/in_money',
          name: 'users/in_money',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              // registerModel(app, require('./models/in_money_orders'))
              cb(null, require('./routes/users/InMoney'))
            }, 'in_money')
          }
        },
        {
          path: 'users/in_money_orders',
          name: 'users/in_money_orders',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              registerModel(app, require('./models/in_money_orders'))
              cb(null, require('./routes/users/in_money_orders'))
            }, 'in_money_orders')
          }
        },
        {
          path: 'users/out_money_orders',
          name: 'users/out_money_orders',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              registerModel(app, require('./models/out_money_orders'))
              cb(null, require('./routes/users/out_money_orders'))
            }, 'out_money_orders')
          }
        },
        {
          path: 'users/holdings',
          name: 'users/holdings',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              registerModel(app, require('./models/holdings'))
              cb(null, require('./routes/users/holdings'))
            }, 'holdings')
          }
        }, {
          path: '*',
          name: 'error',
          getComponent(nextState, cb) {
            require.ensure([], require => {
              cb(null, require('./routes/error'))
            }, 'error')
          }
        }
      ]
    }
  ]

  return <Router history={history} routes={routes} />
}

export default connect(({app}) => {app})(router)

这样写会报错 Uncaught TypeError: Cannot call a class as a function

Most helpful comment

require('./models/modelName')得到的不就是model吗

补充,如果想在router里发起dispatch请求,可以用app._store.dispatch({ ..... })

All 2 comments

require('./models/modelName')得到的不就是model吗

补充,如果想在router里发起dispatch请求,可以用app._store.dispatch({ ..... })

@wuyunjiang 多谢

Was this page helpful?
0 / 5 - 0 ratings

Related issues

yunfeit picture yunfeit  ·  3Comments

kpaxqin picture kpaxqin  ·  3Comments

not3 picture not3  ·  3Comments

sorrycc picture sorrycc  ·  3Comments

mclouvem picture mclouvem  ·  4Comments