* Widgets
class openerp.Widget()
是所有可视化组件的基础类
# DOM Root
Widget() 得到DOM Root
openerp.Widget.el Root
openerp.Widget.$el jQuery打包
openerp.Widget.template 生成Root
openerp.Widget.tagName 生成元素 默认是div
openerp.Widget.id 生成Root的id属性
openerp.Widget.className
openerp.Widget.renderElement() 渲染是生成Root
# 使用widget
openerp.Widget.init(parent)
加元素
openerp.Widget.appendTo(element) 加到后面
openerp.Widget.prependTo(element) 加到前面
openerp.Widget.insertAfter(element) 插在元素的后面
openerp.Widget.insertBefore(element) 插在元素的前面
openerp.Widget.destory()清理
openerp.Widget.alive(deferred[, reject=false]) 状态操作
openerp.Widget.isDestroyed() 检测有没有销毁
# 访问DOM内容
openerp.Widget.$(selector)
this.$(selector)
this.$el.find(selector)
# 重设DOM Root
openerp.Widget.setElement(element)
element 可以是元素,也可以jQuery对象
# DOM事件处理
openerp.Widget.events
如
events:{
'click p.oe_some_class a':'some_method',
'change input':function(e){
e.stopPropagation()
}
}
openerp.Widget.delegateEvents() 代理绑定到DOM上面
openerp.Widget.undelegateEvents() 解绑
# 子类Widget
通过extend
var MyWidget = openerp.Widget.extend({
// QWeb template to use when rendering the object
template: "MyQWebTemplate",
events: {
// events binding example
'click .my-button': 'handle_click',
},
init: function(parent) {
this._super(parent);
// insert code to execute before rendering, for object
// initialization
},
start: function() {
var sup = this._super();
// post-rendering initialization code, at this point
// allows multiplexing deferred objects
return $.when(
// propagate asynchronous signal from parent class
sup,
// return own's asynchronous signal
this.rpc(/* … */))
}
});
// Create the instance
var my_widget = new MyWidget(this);
// Render and insert into DOM
my_widget.appendTo(".some-div");
my_widget.destroy();
# 开发指南
@ 尽量少用id ,万一要用id 要用 _.uniqueId() 生成
this.id=_.uniqueId()
@ 尽量少用普通css名字 如 content navigator
@ 尽量少用全局选择器 用 $el 或 $()
@ 所有的组件都要继承 Widget()
====================
* RPC
采用异步的方式来调用
#高级API
访问对象方法用 openerp.Module
映射服务端对象用 call() 和 query()
var Users = new openerp.Model('res.users');
Users.call('change_password', ['oldpassword', 'newpassword'],
{context: some_context}).then(function (result) {
// do something with change_password result
});
query()是 search+read 在后端操作
Users.query(['name', 'login', 'user_email', 'signature'])
.filter([['active', '=', true], ['company_id', '=', main_company]])
.limit(15)
.all().then(function (users) {
// do work with users records
});
openerp.Model.call(method[, args][, kwargs])
method 是rpc的方法名
args 传入方法的参数
kwargs 关键词参数
openerp.Model.query(fields)
fields 字段列表
class openerp.web.Query(fields)类下方法
openerp.web.Query.all() 得到上面query() 集的所有
openerp.web.Query.first() 要第一条,没有就是null
openerp.web.Query.count() 得到的记录总数
openerp.web.Query.group_by(grouping...) 分组来列表
openerp.web.Query.context(ctx) 添加上下文
openerp.web.Query.filter(domain) 条件过滤domain表达式
opeenrp.web.Query.offset(offset) 设定起点
openerp.web.Query.limit(limit) 设定要返回的数量
openerp.web.Query.order_by(fields…) 记录排序
#聚合
some_query.group_by(['field1', 'field2']).then(function (groups) {
// do things with the fetched groups
})
openerp.web.QueryGroup.get(key)
得到key的值,key可以为:
@ grouped_on
@ value
@ length
@ aggregates
openerp.web.QueryGroup.query([fields...]) 等价于
openerp.web.Model.query()
openerp.web.QueryGroup.subgroups()
#低级API RPC访问python
opeenrp.session()
如:
openerp.session.rpc('/web/dataset/resequence', {
model: some_model,
ids: array_of_ids,
offset: 42
}).then(function (result) {
// resequence didn't error out
}, function () {
// an error occured during during call
});
========================
* Web 客户端
写测试用例
# 断言
ok(state[, message])
strictEqual(actual, expected[, message]) 相当于 ok(actual === expected, message))
notStrictEqual(actual, expected[, message]) 相当于 ok(actual !== expected, message))
deepEqual(actual, expected[, message])
notDeepEqual(actual, expected[, message])
throws(block[, expected][, message]) 抛出异常
equal(actual, expected[, message]) 宽松相等
notEqual(actual, expected[, message])
示例:
{
'name': "Demonstration of web/javascript tests",
'category': 'Hidden',
'depends': ['web'],
'js': ['static/src/js/demo.js'],
'test': ['static/test/demo.js'],
}
// src/js/demo.js
openerp.web_tests_demo = function (instance) {
instance.web_tests_demo = {
value_true: true,
SomeType: instance.web.Class.extend({
init: function (value) {
this.value = value;
}
})
};
};
// test/demo.js
test('module content', function (instance) {
ok(instance.web_tests_demo.value_true, "should have a true value");
var type_instance = new instance.web_tests_demo.SomeType(42);
strictEqual(type_instance.value, 42, "should have provided value");
});