我正在查看dojo源代码,但无法找到menu data
如何被ComboBox
,FilteringSelect
等小部件所取代。 ComboBox
继承使用ComboBoxMixin
PopupManager
DropDownMenu
继承dijit._MenuBase
但是我无法看到_MenuBase
中的哪个地方抓取菜单项数据并从中构造菜单元素。
Menu.html
中有templates/
,'MenuItem.html'但是这些模板的使用方式尚未明确。
这就是我从源头上理解的内容,但menu data (may be data from store or hard coded data)
如何被这些小部件所取代尚未被理解。有人可以解释一下吗?
答案 0 :(得分:1)
所以在dojo 1.7.2中,他们有一个_AutoCompleterMixin。 _AutoCompleterMixin混合到ComboBoxMixin
中_AutoCompleterMixin有一个startSearch函数,只要用户在组合框中输入内容就会调用它。
startSearch函数实际上从存储中执行提取。在_AutoCompleteMixin.js的第584行:
var resPromise = _this._fetchHandle = _this.store.query(query, options);
Deferred.when(resPromise, function(res){
_this._fetchHandle = null;
res.total = resPromise.total;
_this._openResultList(res, query, options);
当获取数据时,它调用_openResultList,它将数据传递给_ComboBoxMixin.js中的createOptions函数
createOptions函数通过使用传递给它的项来填充下拉列表DOM
答案 1 :(得分:0)
尼尔
您使用的是哪个版本的道场? 在dojo 1.4中,它的行为如下:
在dijit / form / ComboBox.js中,您将看到一个名为dijit.form._ComboBoxMenu的类 在这个类中有一个名为_createOption的方法,在其中您将看到li元素的DOM创建(菜单是典型的ul li格式)
来自代码:
_createOption: function(/*Object*/ item, labelFunc){
// summary:
// Creates an option to appear on the popup menu subclassed by
// `dijit.form.FilteringSelect`.
var labelObject = labelFunc(item);
var menuitem = dojo.doc.createElement("li");
dijit.setWaiRole(menuitem, "option");
if(labelObject.html){
menuitem.innerHTML = labelObject.label;
}else{
menuitem.appendChild(
dojo.doc.createTextNode(labelObject.label)
);
ComboBox类(实际上是ComboBoxMixin)调用_openResultList函数,该函数在弹出窗口小部件上调用_createOption。好的部分是弹出窗口小部件是ComboBox的属性,因此它是可插入的
它还有一个_startSearch函数,它从商店中提取项目,设置一个计时器,当它到期时,它会显示弹出窗口
onComplete: dojo.hitch(this, "_openResultList"),
希望这会有所帮助
维杰