下面列舉一些實例來說明Store findRecord 這個方法簡單使用。
比如你有一個userStore,這時想要去查找一個名字為Felix的user (前提當然是user model得有一個user的field),查詢如下:
var user = userStore.findRecord('firstName', 'Felix');
上面代碼執行的結果返回的是一個Model實例。
再看一個簡單實例,需求是得到Felix這個員工的ID號,查詢如下:
getUserID : function (name) { var userStore = this.getUserStore(); var user = userStore.findRecord('name', 'Felix'); return user.get('id'); }
好,這里想說明下findRecord這個方法的一些局限性:
- 只能找到第一條匹配的record
- 當前的store如果是被filter過的,則只能在被filter的數據集中去查找匹配的record,而不是最初的store
此外findRecord這個方法有幾個參數,這里務必得說明:
- fieldName (必選) : 需要作為查詢條件的field name
- value(必選): 查詢的值,與fieldName匹配
- startIndex(可選):從store的哪個位置開始查詢, 默認值是0
- anyMatch(可選): 默認是從第一個字符開始匹配,類似SQL中的‘a%’, 如果設置為True,則是全匹配,類似SQL中的‘%a%’,默認值是false
- caseSensitive(可選): 設置為true則開啟大小寫敏感, 默認值是false
- exactMacth(可選): 設置為True是精確查詢, 默認是false (^ and $ characters added to the regex).
針對最后一個參數exactMacth值得注意,如果有個store數據為[['145', 'PO'], ['245', 'SO'], ['1', 'SI']], model為{fieldOid, fieldName}.
這時的需求是要找到fieldOid為1的record的filedName值(正確結果是SI才對)
var field = fieldStore.findRecord('fieldOid', '1'); var fieldName = field.get('fieldName');
我們覺得這樣應該沒問題,可以得到SI這個值,可是結果卻是PO,why?
之前發現網上有文章 http://www.2cto.com/kf/201306/218487.html 說這是EXTJS的一個bug,我想應該不是。
因為value這個查詢是通過正則表達式來做的,所以當1作為value傳進去的時候,API用類似SQL ‘a%’表達式做查詢,當然145被找到,所以返回的結果是PO。
所以為了精確的查詢所要的記錄,則需要下面的查詢:
var field = fieldStore.findRecord('fieldOid', '1', 0, false, false, true); var fieldName = field.get('fieldName');