在昨天 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 已經包裝好的函式
方便開發人員使用,不用在自己寫取得方法
這個有兩種用法
第一種: 呼叫指定的函示 (就是上面的程式)
可以直接指定是哪一張 model
跟 method
但要記得若是寫指定model
跟 method
的情況,必定要定義一個屬性 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 點是筆者的想法與常用到的情境
model
跟 method
,也讓開發者工具的 Network
的 Request
名稱是明確的route
,節省前端可能需要呼叫多個才能完成原本的流程model
是已經存在 (像是 sale.order
),當前使用者沒有該 model
的權限,用 route
來處理無法存取的部分,減少錯誤發生當然有更多情境,就是依照各位遇到的情況
而筆者建議可以是可以另外定義 route
,切分職責才不會讓 model
一團亂