Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于 dva@1.2 和动态加载的问题 #533

Closed
sorrycc opened this issue Jan 22, 2017 · 11 comments
Closed

关于 dva@1.2 和动态加载的问题 #533

sorrycc opened this issue Jan 22, 2017 · 11 comments
Labels

Comments

@sorrycc
Copy link
Member

sorrycc commented Jan 22, 2017

由于 dva@1.2 中引入了 app.unmodel 以及为 app.model 增加了冲突校验,不允许对相同的 namespace 注册多次 model,而动态加载路由需要多次执行 app.model,所以很多人升级到 1.2 时就出错了。

典型出错

bug

建议方案

在 router.js 里用一个辅助方法注册 model 。

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

使用

registerModel(app, require('./models/users'));

参考

dvajs/dva-example-user-dashboard@df2a7a0

@rendongsc
Copy link

@sorrycc 使用辅助方法注册 model,在react-native 下(非动态加载)还是有问题。
android系统,点击返回键退出系统,重新进行系统就会报#465的问题。

@sorrycc
Copy link
Member Author

sorrycc commented Jan 24, 2017

@rendongsc model 是动态载入的吗? 重新进入系统为啥只执行 app.model 的代码呢?

@rendongsc
Copy link

不是动态载入的,重新进入系统为什么要再次执行app.model原因不清楚。

const cached = {};
function registerModel(app, model) {
  if (!cached[model.namespace]) {
    app.model(model);
    cached[model.namespace] = 1;
  }
}
const app = dva();
app.use(createLoading());
registerModel(app, Auth);
registerModel(app, Initial);
registerModel(app, Cooperate);
registerModel(app, Mail);
registerModel(app, Infomation);
app.router(() => <Router />);
export default app;

@sorrycc
Copy link
Member Author

sorrycc commented Jan 24, 2017

可以先加 try...catch 解决这个问题,有时间可以研究下为啥执行多次。

function registerModel(app, model) {
  try {
    app.model(model);
  } catch(e) {}
}

@helloworldtang
Copy link

我这边报错是因为注册代码写了两次,

app.model(require("./models/users"));

// 2. Plugins
// app.use({});
app.use(createLoading());

// 3. Model
// app.model(require('./models/example'));
app.model(require('./models/users'))

@AsceticBoy
Copy link

@sorrycc 老师,想问下根据路由动态加载路由和在index.js上同时加载,性能相差会很大吗

@sorrycc
Copy link
Member Author

sorrycc commented Mar 1, 2017

@AsceticBoy 项目大的话会相差比较大,因为下载时间长了。

@K-walker
Copy link

K-walker commented Mar 3, 2017

@sorrycc 大叔,我想请教一个问题:
比如我Main.js 内容如下

render() {
     return (
         <Header />    
             // 动态显示页面router
         <Bottom/>
     )
}

这个Main.js只是一个公共容器,包含公共的头部组件和底部组件,我需要在中间去动态的加载不同
页面的router请问该如何实现?还是说得另外建一个新的文件包含以上结构,然后在其中添加我所需要
加载页面的router ? 有没有这样一个动态加载页面router的方法,公用这一个Main.js的结构?

@buhe
Copy link

buhe commented Mar 18, 2017

model.call(this, {
        namespace: '@@dva',
        state: 0,
        reducers: {
          UPDATE: function UPDATE(state) {
            return state + 1;
          }
        }
      });

Android 的 notify 进入 app ,这个 internal 的 namespace 无论如何都会被 inject, 因为 checkmodel 的原因,crash
这个外部还没有太好的办法 workaround
@sorrycc

@sorrycc sorrycc mentioned this issue Aug 9, 2017
@paranoidjk
Copy link
Member

@buhe 能否提供一个最小可复现代码 demo? 什么情况下会重复调用 app.start() ?

@ivanberry
Copy link

所以现在这问题还是依旧吗?

  • dva: 2.1.0
function registerModel(app, model) {
  try {
    app.model(model);
  } catch(e) {}
}

而不建议使用

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

是这么理解吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants