117 lines
5.9 KiB
Plaintext
117 lines
5.9 KiB
Plaintext
【实现】问题4:
|
||
修改@GET注解,支持传入两个参数,一个是请求地址,一个是请求是否需要处理返回参数
|
||
|
||
【实现】问题1:
|
||
|
||
1:实现功能:创建启动窗口
|
||
1:配置文件中设置 StartPage = 'Home'
|
||
2:Index.utils.ts 封装方法读取 StartPage ,根据 StartPage 参数自动载入对应的controller
|
||
2:Init.run.ts 调用 对应方法创建窗体
|
||
|
||
2:实现功能:自动创建非启动窗口的其他窗口 (考虑通过装饰器实现)
|
||
1:页面JS的渲染进程中,触发 ipcRenderer,
|
||
2:Init.run.ts 中 实例化 application.ipc(应用级ipc)然后监听渲染进程的事件
|
||
3:自动导入并创建渲染进程需要打开的窗口 controller,
|
||
4:窗口分为两种,所以设计继续进行步骤 5 的思路规划
|
||
1:独立的新窗口
|
||
2:依赖主窗口的子窗口
|
||
5:如果是依赖窗口,需要知道子窗口所依赖的父窗口 BrowserWindow 对象是 Windows.model.ts 的哪个?
|
||
6:所以需要在 Index.utils.ts 中封装方法根据 StartPage 参数自动 从 Windows.model.ts 寻找应用的主窗体,然后返回窗体
|
||
7:在子窗体的设置 parent 属性,然后启动子窗体作为父窗体的子
|
||
|
||
未实现 3:在controller类上实现注解 @Created(),实现 new BrowserWindo 和 loadFile 过程
|
||
|
||
|
||
【实现】问题2:
|
||
|
||
功能需求:
|
||
|
||
electron 的 controller 中实现 render 函数
|
||
|
||
问题拆分:
|
||
|
||
1:首先 controller 类中要定义 render 方法,render 方法返回需要传递给模板引擎jade的数据对象,
|
||
|
||
2:在注解 CretedWindow 原本的步骤中是先根据类名自动载入配置文件实现了窗体的创建也就是,自动 new BrowserWindow 的过程
|
||
但是这个步骤是不对的!!
|
||
|
||
注意:而且 原本的 new BrowserWindow 载入的html文件是gulp来生成的,所以不能传入动态数据!
|
||
需要去除gulp自动编译jade为html的监听!
|
||
|
||
需要更改思路和代码:
|
||
|
||
1:在注解 CretedWindow 中直接new被注解的类,然后注解内部调用其 自定义的 render 方法,得到需要被传给模板引擎的数据
|
||
2:注解内部调用 jade 插件 的 renderFile 方法,renderFile 方法需要三个参数,分别是:
|
||
|
||
renderFile(原始jade文件路径, 传给模板引擎的数据+jade插件设置参数, 回调函数 (null,res)=>{})
|
||
|
||
注意:
|
||
1:原始jade文件路径可以根据被注解的类的名称自动寻找
|
||
2:render函数的返回数据 需要和 jade插件的设置项 进行 Object.assign 合并
|
||
3:回调的第一个参数据源码中得出就是null,第二次参数 res 才是正在编译后的html。
|
||
|
||
3:这一步我们已经拿到了生成好的且带有数据的最终HTML,那么需要再次根据被注解类的名称,自动将文件生成到dist/路径下
|
||
具体路径为:Note/dist/application/page/Home/Home.html,这路径中 的 Home 也就是类名,需要动态生成文件夹,和
|
||
文件夹里面的同名 HTML 文件
|
||
|
||
4:数据注入成功,模板写入成功,这一步需要实现的就是正常的 new BrowserWindow 即可!!
|
||
|
||
最后实现效果:
|
||
|
||
@CretedWindow()
|
||
export class HomeController implements BaseControllerTypes {
|
||
render(): { [p: string]: any } {
|
||
return {
|
||
title: '测试传给模板的数据'
|
||
};
|
||
}
|
||
// 事件
|
||
public event(): void {}
|
||
// ipc
|
||
public ipc(): void {}
|
||
}
|
||
|
||
问题3:
|
||
目前效果:
|
||
Controller上的装饰器 @CretedWindow() 会根据 类的名称在创建桌面窗口的时候自动去寻找对应html文件。
|
||
|
||
目前的问题:
|
||
1:这种通过大家遵守一些约定,能够让程序自动去做一些重复性的事情,减少了冗余无用的代码,但是目前只能寻找类型相同的窗口html文件,不够自由!
|
||
2:这种约定大于配置的方式,一定严格意义上也是所谓的"硬编码"!开发者在使用的时候灵活性缺失!
|
||
|
||
需要实现:
|
||
继续改造问题2已经实现的功能,controller控制器中定义render方法返回数据,能够自动将数据传递给前端模板渲染到页面上(其实这个功能就是php的模板渲染)
|
||
已实现效果:
|
||
@CretedWindow()
|
||
export class HomeController implements BaseControllerTypes {
|
||
render(): { [p: string]: any } {
|
||
return {
|
||
title: '测试传给模板的数据',
|
||
desc: '介绍'
|
||
};
|
||
}
|
||
}
|
||
|
||
需要改造成的效果:
|
||
@CretedWindow()
|
||
export class HomeController implements BaseControllerTypes {
|
||
@render('Setting')
|
||
public hello(): { [p: string]: any } {
|
||
return {
|
||
title: '测试传给模板的数据',
|
||
desc: '介绍'
|
||
};
|
||
}
|
||
}
|
||
|
||
其他不成熟且大胆且未经深思考虑过的模糊想法:
|
||
|
||
同时还有个更加大胆的想法,直接借鉴java框架springboot的代码编写风格和思路,实现控制器中,每个方法都是可以控制一个页面的创建和模板数据传递渲染
|
||
而不是现在这种:通过控制器实现窗口的创建,控制器中render方法实现模板数据传递渲染
|
||
|
||
可能存在的问题:
|
||
|
||
1:新的不成熟的想法,不好的地方在于,采用新的设计思路会导致控制器中无法独立处理ipc,ui,后台监听等任务,如果要解决这个复杂的问题,那么需要开发一套
|
||
针对于:ipc,ui,后台监听,事件的全新的装饰器,让代码风格更加彻底的java化,这样做的好处是开发者只需要看看文档就会用框架!
|
||
一切复杂的东西都将会隐藏在简单的表面之下!,同时带来一个新问题,开发起来会很累,不过这样才会很有意思。
|