iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Odoo

Odoo 14 Javascript 開發心路歷程系列 第 20

Day 20 RPC 介紹 - 使用方式介紹

  • 分享至 

  • xImage
  •  

在昨天 JS 的程式中

各位應該有發現筆者有用到一個函式是 _rpc

// ironman_js/static/src/js/action_view.js
// ...				
    let dataPromise = this._rpc({
        model: 'todo.list',
        method: 'get_self_todo_list',
        args: [[]],
    });
// ...

這個東西簡單來說就是向後端取得資料

_rpc 是 odoo 已經包裝好的函式

方便開發人員使用,不用在自己寫取得方法

這個有兩種用法

第一種: 呼叫指定的函示 (就是上面的程式)

可以直接指定是哪一張 modelmethod

但要記得若是寫指定modelmethod 的情況,必定要定義一個屬性 args

請看這一段程式,前幾天就有先定義好的

def get_self_todo_list(self) -> list:
    return self.search_read(
        domain=[('user_id', '=', self.env.user.id)],
        fields=('name', 'finished')
    )

這個 method 只有一個 self 參數,而 args 是一個 Array

對應的位置就是 args 裡每個位置的資料對應到的就是 method 的順序

還是很混亂嗎?

請思考下面的例子, filter_name 有兩個參數, self 各位應該都知道是指那些已存在的紀錄

def filter_name(self, name) -> list:
	print('ids:', self.ids)
	print('filtered name:', name)
	remain = self.filtered(lambda x: x.name == name)
    return remain.ids

所以 JS 呼叫時的 args 會變成這樣

this._rpc({
    model: 'any.model',
    method: 'filter_name',
    args: [[1, 2, 3, 4], '測試'],
});

所以在 filter_name 的 print 會出現

ids: [1, 2, 3, 4]
filtered name: 測試

所以在文章開頭寫的 JS,傳入的是空陣列,代表若 print self.ids 的結果會是 []

這樣各位應該比較清楚對應的方式了

第二種: 呼叫 route

this._rpc({
    route: '/web/data/todo_list',
});

這個方式就是呼叫已經存在或是額外定義的 route

為什麼要這樣做呢?

以下 3 點是筆者的想法與常用到的情境

  1. 隱藏指定的 modelmethod ,也讓開發者工具的 NetworkRequest 名稱是明確的
  2. 處理的程式流程比較複雜,包成一個的 route ,節省前端可能需要呼叫多個才能完成原本的流程
  3. model 是已經存在 (像是 sale.order),當前使用者沒有該 model 的權限,用 route 來處理無法存取的部分,減少錯誤發生

當然有更多情境,就是依照各位遇到的情況

而筆者建議可以是可以另外定義 route ,切分職責才不會讓 model 一團亂


上一篇
Day 19 實作 9: 建立 action client view - 調整模板,呈現 todo list 的項目
下一篇
Day 21 RPC 介紹 - 底層基本面講述
系列文
Odoo 14 Javascript 開發心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言