jsdk-offical
Version:
JSDK is the most comprehensive TypeScript framework, like JDK.
131 lines (109 loc) • 4.43 kB
Markdown
JSVP是一个由JSDK推荐的应用层开发架构,它包括三层:页面层-视图层-服务层,即Service-View-Page,类似于MVC(Model-View-Controller)。实践证明,这样的应用层架构的优点是结构清晰、开发高效、便于重用、易于维护。
其中:
> Service层:提供共享式服务,比如业务数据的存取、邮件/短信收发、定时器动画、大数据处理线程等公共服务,被全体View或Page调用。一组相关的服务方法应集中在一个服务类中。
>
> View层:是widgets的容器,提供对托管widgets的渲染、销毁、事件响应与数据存取。一个组件应该仅被一个View管理,一个页面允许存在多个View类。
>
> Page层:是页面内所有Views的控制器,也是页面级或应用级的事件处理器。每个页面应对应一个Page类。
* *所有Service类、View类、Page类都必须使用@compo注解*
* *Service类中仅可使用@inject注解自动注入其他Service类,不应该用到任何View类或Page类*
* *View类中仅可使用@inject注解自动注入其他View类或Service类,尽可能少用到Page类*
* *Page类中仅可使用@inject注解自动注入View类或Service类,不应该用到其他Page类*
JSVP推荐的工程目录如下:
```
+ build/ //build scripts
+ dist/ //complied js files
+ libs/ //libraries
+ html/ //html files
+ style/ //css and images
- source/ //ts source code
+ model/ //model classes
+ api/ //api classes
+ service/ //service classes
+ view/ //view classes
+ page/ //page classes
```
例如,你需要一个读取登录用户信息的页面。你可以参考以下步骤:
1. 在html目录下创建页面<code>login_user.html</code>
```
- html/ //html files
login_user.html
```
记得在<code>login_user.html</code>中静态加载JSDK核心库:
```html
<script src="/libs/jsdk/{JSDK-VERSION}/jscore.js"></script>
<script src="/libs/jsdk/{JSDK-VERSION}/jsdk-config.js"></script>
```
2. 在source目录中创建这些目录及文件:
```
- source/ //ts source code
- model/
User.ts
- api/
UserApi.ts
- service/
UserService.ts
- view/
UserView.ts
- page/
LoginUserPage.ts
```
3. 最后,我们创建一个全局文件:<code>app-config.ts</code>放置于source根目录下,用来初始化应用:
```javascript
JS.config({
minimize: false, //for develop mode
jsdkRoot: '/libs/jsdk/{JSDK-VERSION}',
libRoot: '/libs'
})
App.init({
name: 'MyApp', //project name
version: '1.0' //project version
})
```
同时在<code>LoginUserPage.ts</code>加载此<code>app-config.js</code>:
```javascript
JS.imports([
'$jsvp', //load jsvp library
'/source/app-config.js', //load global file
'/source/page/LoginUserPage.js', //load current page class
...
]).then(()=>{
Page.init(LoginUserPage);
})
```
4. 完整的示例代码请访问:
http://fengboyue.github.io/jsdk/examples/app/html/login.html
JSVP支持两级事件机制,分别是页面级事件和应用级事件。
一个应用级事件会在当前浏览器的所有页面中广播。这意味着,当一个页面发布应用级事件时,其他页面的订阅者会立即被通知到。
例如,当用户在当前页面上点击“退出”按钮。此按钮发布了一个应用级事件"logout",那么其他页面的订阅代码都会立即知道此事件发生。
其他页面提前订阅“退出”事件:
```javascript
App.onEvent('logout', (e: AppEvent) => {
//self.close(); //用户退出了,我们也把自己关了吧
})
```
当前页面发布“退出”事件:
```javascript
Dom.$1('#btn').on('click', ()=>{
...
App.fireEvent('logout');
})
```
一个页面级事件只会在当前页面中广播。
例如,页面上的某个组件widget1重新加载数据后,发布了一个页面级事件“widget1.reload”,那么同一页面的订阅代码都会立即知道此事件发生。
其他代码提前订阅事件:
```javascript
Page.onEvent('widget1.reload', (e) => {
//widget1重新加载了,我们也刷新下吧
})
```
widget1发布事件:
```javascript
Page.fireEvent('widget1.reload');
```