我遇到了一个问题,即创建一个“依赖”行为,其中要依赖的对象是尚未加载的<option/>
标记,因为它通过ajax调用加载。似乎存在竞争条件,其中依赖行为试图在ajax调用完成之前加载。以下是未能加载依赖行为的元素标记:
<div class="control-group" data-behavior="Depend" data-depend-options="{{'depends': 'W9', 'required': true}}">
“W9”将是<option/>
标记的ID。此选项标记将由以下代码加载:
<select name="ProfessionalLicenseType" id="ProfessionalLicenseType" class="required" data-behavior="Dropdown" data-dropdown-options="{{ 'type': 'ObjectType', 'data': {{ 'Object': 'ProfessionalLicense' }}, 'selected': '{AttachmentType}', 'id': 'ObjectType' }}">
我是否应该使用HTML标记来创建依赖行为?我应该尝试使用javascript来创建这种依赖吗?
提前致谢。
答案 0 :(得分:0)
Depend行为支持绑定到select标签的值,而不是选项标签:
<div class="control-group" data-behavior="Depend" data-depend-options="{{'depends': 'ProfessionalLicenseType=W9', 'required': true}}">
在初始化时,Depend行为将检查ProfessionalLicenseType的值,并发现它是空的,禁用/隐藏您的从属div标签。它还将向ProfessionalLicenseType下拉列表添加更改事件处理程序(qbo.Depends.js第45行):
source.addEvent('change', qbo3.dependencyCheck.pass([source, element, options, depends]));
Dropdown行为将稍后(异步)通过AJAX加载您的选项,如果设置了行为的options.selected,将设置匹配的option.selected = true(qbo.Dropdown.js第105行):
if ((row[value] || row) == options.selected) {
target.options[target.options.length - 1].selected = true;
target.defaultIndex = target.options.length - 1;
target.fireEvent('change');
}
这项工作是上面提到的target.fireEvent('change')
;这将触发Depend行为重新评估依赖关系并做出适当的反应。