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

数据作用域的疑问 #40

Closed
g770728y opened this issue May 16, 2019 · 7 comments
Closed

数据作用域的疑问 #40

g770728y opened this issue May 16, 2019 · 7 comments

Comments

@g770728y
Copy link

考虑将 appInfo + userInfo 统一保存到顶级作用域, 各页面可共享, 即如下结构:

App  ( data: { appInfo, userInfo } )
  | ---   BizPage1 
  | ---   BizPage2
  | ---   BizPageN

但由于 amis 未提供 App Renderer, 所以 使用了 service, 如下:

export default {
    type: 'service',       <==  使用service作为顶级组件
    initApi: '/api/mock2/page/initData',            <=============     ( 1 ) 
    body: {
        type: 'grid',
        columns: [
            {
                type: 'page',
                name: 'page1',
                md: 3,
                // initApi: '/api/mock2/page/initData',             <========       ( 2 )
                children: (...args)=>{console.log("args-page1", args); return null;}
            },
            {
                type: 'page',
                name: 'page3',
                body: 'page3',
                md: 9,
            },
        ],

    },
};

存在的问题是:
只有 顶级的 service.initApi ( 1 ) 会自动执行
page.initApi ( 2 ) 不会执行.


疑问1: amis 中共享user等信息的正确方式是怎样的呢?
疑问2: 为何server中嵌套pageinitApi不会被执行?

@2betop
Copy link
Collaborator

2betop commented May 16, 2019

调用amis渲染器入口函数,

render(schema, props, env)

注意第二个参数是下发到渲染的 props 里面的,如果你在这个时候下发数据,这里面的数据就是全局的了

render(schema, {
  data: {
    appInfo: xxx,
    userInfo: xxx, 
   acl: xxx //  你还可以注入功能方法,这样 visibleOn 里面都能些  acl.can('doXXX')
  }
})

@g770728y
Copy link
Author

return render(schema, {
                location,
                theme,
                aaa: 555,       <====== ( 1 )
                bbb: 'test',    <====== ( 2 )
                type: 'axx',    <====== ( 3 )
                data: {eee:3},   <======  ( 4 )
                ui: {
                    isVisibleFun: () => true,   <===========  ( 5 )
                    isVisible: true                    <===========  ( 6 )
                }
            }, this.env);

schema中:

  1. 使用tpl打印 aaa , bbb , eee , 无法获取到aaa, bbb:
{
    type: 'page',
    body: {
      type: 'tpl',
      tpl: '${&|json|html}'     =======>   { eee: 3}
    },
}

aaa, bbb 因为不在data中, 如何取出?


  1. 使用form.formItem:
{
   type: form,
   controls: [
       ...
       disabledOn: "ui.isVisibleOn()" ,           <== 无效
       disabledOn: "ui.isVisible",                    <==  无效
       disabledOn: "() => ui.isVisibleOn()"    <== 无效
   ]  
}

求指教...

@2betop
Copy link
Collaborator

2betop commented May 16, 2019

都要放在 data 里面才能取出

@g770728y
Copy link
Author

这样的话, 感觉有两个潜在问题:
1 ) 各级data在合并时, 容易存在重名覆盖问题
2 ) 顶级data既有数据也有方法, 方法也将逐渐向下合并


请教一下:
为何没有考虑 data 在合并时, 带上自己的name减少冲突机会呢?

{  
     [ top_component_name ] : { x: 1, y: 2},
     [ parent1_component_name ] : {x: 2, z: 3},
     [ self_component_name ] : { x: 3, z: 4}
}

可能实际情况没这么多冲突机会, 纯好奇 :)

@2betop
Copy link
Collaborator

2betop commented May 16, 2019

不会向下合并,每一层的 原型链指向上一层的数据

@g770728y
Copy link
Author

原型链是技术实现手段, 但在 最终使用amis 的程序员看来, 这与合并没啥两样...
不过确实稍微注意一下, 普通的mis系统也不会有什么命名冲突吧

感谢您的耐心回复 👍

@2betop
Copy link
Collaborator

2betop commented May 16, 2019

如果出现重名可以尝试 ${__super.xxxx}

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

No branches or pull requests

2 participants