QBO V3行为操作顺序

时间:2014-06-11 19:29:18

标签: javascript

我遇到了一个问题,即创建一个“依赖”行为,其中要依赖的对象是尚未加载的<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来创建这种依赖吗?

提前致谢。

1 个答案:

答案 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行为重新评估依赖关系并做出适当的反应。