视图(View)& 模型 (model) & 处理器 (Handler)
视图(View)
前面讲到,视图是feature的一部分,也是最重要最复杂的一部分。那么 feature 中定义的 view 当然只是定义的view的名称,具体view的配置不需要单独有个描述文件,在feature.js级下建个views目录,然后创建 view名称相同的js文件:
// views/test.js
define({
events: {
'click btn': 'clickIt'
},
avoidLoadingHandlers: true,
extend: {
serializeData: function(su) {
var data = su.apply(this);
data.abc = [
{name: 'aaa', sex: 'x', id: 'b'},
{name: 'bbb', sex: 'x', id: 'c'},
{name: 'ccc', sex: 'x', id: 'd'},
{name: 'ddd', sex: 'x', id: 'e'},
{name: 'eee', sex: 'x', id: 'f'},
{name: 'fff', sex: 'x', id: 'g'}
];
return data;
}
}
});
同时 view 是有模板的,同样也是定义在 templates.html,{{view "test"}}
里面的内容是 test 这个view的模板,里面的表达式用户请参照 Handlebars:
{{/layout}}
...
{{layout}}
{{#view "test"}}
<button id="btn" class="btn">Click Me</button><br/>
{{#each abc}}
name: {{name}}, sex: {{sex}}, id: {{id}}<br/>
{{/each}}
{{/view}}
extend方法:
- serializeData 数据处理
- afterRender view 渲染后事件
- templateHelpers 模板数据绑定
API
模型 (Model)
另一方面,它又与 Model、Handler 组成 MVC 模式,共同组成界面,这样看来 feature 不过是 view 的一个管理容器,界面的复杂度完全由 view 掌控。view 除了模板外,还需要后台数据,Model 就是用来与后台交互的,而在cdeio中,model 其实是一个url,通常是从featurePath开始,model 正好对应服务中的 Router
// views/main.js
define({
events: {
'click parent-*': 'toggleSubMenu'
},
avoidLoadingHandlers: true,
model: 'system/menu'
});
处理器 (Handler)
用来绑定界面的事件,在处理器中,你可以任意发挥,调用 cdeio平台 所提供的各种 API 来完成你所需的功能。
// handlers/test.js
define({
clickIt: function() {
var app = this.feature.module.getApplication();
app.loadFeature('test/forms/frontend').done(function(feature) {
app.showDialog({
title: 'Hello',
view: feature.views.simple,
buttons: []
});
});
}
});