(19)odoo中的javascript

* 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");
        });

你可能感兴趣的:((19)odoo中的javascript)