我是使用Cfajaxproxy的新手,我试图选择许多复选框,然后循环浏览所有检查复选框,然后使用Cfajaxproxy和jquery和jQuery和jQuery。/p>
标记是通过查询循环产生的,但这里有一个带来问题的区域的样本:
<span id="1569_2627_text">I certify that the employee has been trained in the use of the following
equipment (please check all that apply):</span><br />
<input type="hidden" name="2627_max_length" id="2627_max_length" value="">
<input type="hidden" name="2627_min_value" id="2627_min_value" value="">
<input type="hidden" name="2627_max_value" id="2627_max_value" value="">
<input type="hidden" name="2627_regex_format" id="2627_regex_format" value="">
<input type="hidden" name="2627_system_type" id="2627_system_type" value="">
<input type="hidden" name="2627_app_type_version" id="2627_app_type_version" value="1569">
<input type="hidden" name="2627_question_type" id="2627_question_type" value="CM">
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8509" data-app_type_version="1569">
<span>Face Shield<span>
</label><br />
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8510" data-app_type_version="1569">
<span>Neoprene Gloves<span>
</label><br />
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8511" data-app_type_version="1569">
<span>Apron<span>
</label><br />
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8512" data-app_type_version="1569">
<span>Boots<span>
</label><br />
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8513" data-app_type_version="1569">
<span>Wizard Glove<span>
</label><br />
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8514" data-app_type_version="1569">
<span>Insulated Mitt<span>
</label><br />
<label>
<input class="questionChoice" type="checkbox" name="2627"
value="8515" data-app_type_version="1569">
<span>Insulated Glove<span>
</label><br />
<button class="add_answer" value="2627" data-app_type_version="1569" disabled>Add answer</button>
这是我的CFAJAX代理标签:
<cfajaxproxy cfc="#APPLICATION.cfMapping#.Agency.Agency"
jsclassname="agency_object">
这是它应该在每个检查框上运行的功能:
function saveResponses(question_no, answerValue){
var myagOBJ = new agency_object();
myagOBJ.setHTTPMethod('POST');
myagOBJ.setCallbackHandler(function(result) {
numOfCalls++;
alert(result+ ", call number: "+ numOfCalls);
});
myagOBJ.setErrorHandler(null);
myagOBJ.store_prepopulated_response(
agency_id = #SESSION.agency_object.get_id()#,
jQuery("select##site").val(),
question_no,
answerValue
);
}
这是通过每个检查框循环的jQuery代码:
$("div##" + div + " [name=" + question_no + "]:checked").each(function() {
answerText = $(this).next().text();
answerValue = $(this).val();
identifier = question_no + "_" + answerValue;
if(answers["q_" + identifier] === undefined) {
formAppend();
answers["q_" + identifier] = answerValue;
alert("From Checkbox");
saveResponses(question_no, answerValue);
$("div##saved_answers table").append(
"<tr id="" + identifier + ""><td><strong>" + formName +
"</strong><br>" + questionText + "</td><td>" + answerText +
"<br><button data-app_type_version="" + div +
""class="remove" value="" + identifier +
"">Remove</button></td></tr>"
);
}
});
它调用的CFC的方法是:
<cffunction name="store_prepopulated_response" access="remote" returntype="string" verifyclient="true">
<cfargument name="agency_id" type="numeric" required="true">
<cfargument name="site_id" type="numeric" required="true">
<cfargument name="question_no" type="numeric" required="true">
<cfargument name="response" type="string" required="true">
<cfreturn "Agency id: #agency_id#, Site ID: #site_id#, Question No: #question_no#, Resonse: #response#">
</cffunction>
我仍然只是在测试事物以确保其起作用,因此除返回测试结果外,许多功能实际上都在做任何事情。
当我运行此代码时,它将调用CFC并返回结果,但是它调用了太多次。
例如,如果我选中三个框,它将调用CFC方法7次,如果我选中两个框,它将调用CFC方法5次。我选中所有7个框,CFC方法被称为19次。
我的第一个想法是,也许CFC称为正确的次数,但是CallbackHandler被调用了很多Agency_object并每次都调用该方法,但是我得到了相同的结果。
有人知道为什么会发生这种情况吗?
*(编辑)我刚刚在呼叫计数的实际CFC上添加了计数,实际上它调用了CFC方法太多次了。
"因为CallbackHandler不知道它应处理所有这些响应应处理所有响应"
这就是回调处理程序的工作方式。他们应该处理所有的回应。问题在于,您正在创建多个做同一件事的回调处理程序。每个响应都发送给每个处理程序。
通过使用JavaScript 匿名函数(将function(){...}
作为方法参数传递)从saveResponses
函数中设置处理程序,您正在附加该类的其他回调处理程序。如果您正在为每个请求创建和破坏对象,那可能是有道理的,但是正如帖子的评论中所讨论的那样,最好创建一个实例。使用这种方法,您也应该在此功能之外设置回调处理程序。
为了说明发生了什么,让我们看一下选中3个框并运行saveResponses
时会发生什么:
saveResponses(...){
//...
myagOBJ.setCallbackHandler(function(result) {
numOfCalls++;
alert(result+ ", call number: "+ numOfCalls);
});
//...
}
处理者的附加说明说明了3个复选框 -> 7个呼叫。
- 您第一次打电话给它,您有1个处理程序和1个结果。
- 第二次打电话给它,您添加了一个处理程序(2个处理程序),因此您的1个结果进行了两次。
- 第三次打电话给它,您添加了第三个处理程序,因此1个结果处理了3次。
saveResponse
由于.each()
方法而被称为多次;它可以循环循环由jQuery选择器快速连续返回的每个项目,每个手柄函数一次。
只能加起来6个电话,因此仍然不正确,但是您可以看到这将如何迅速成为一个巨大的问题。第七可能是因为Ajax请求的异步性质。真正发生的事情可能更像是:
-
saveResponses
- 添加回调处理程序
- 发送ajax请求
-
saveResponses
叫- 添加回调处理程序
- 发送ajax请求
- 第一个请求的结果又回来了。有2个处理程序,因此将其发送给两个。
- 2到到目前为止看到的回调
- 第二请求的结果又回来了。2个处理程序,发送给两个。
- 4到达到目前为止看到的回调
-
saveResponses
- 添加回调处理程序
- 发送ajax请求
- 第三请求的结果又回来了。3个处理程序,发送给所有3个。
- 7到达到目前为止看到的回调
课程:在呼叫者之外声明/分配处理程序(在班级实例化的地方是最有意义的)。
如果您真的想了解JavaScript - 并且应该 - 选择 JavaScript的副本:好零件。它很短,但写得很好,使复杂的概念更容易理解。其中有些在您当前的技能水平上可能没有多大意义,而是关注一开始触及的内容(例如匿名功能),然后在您真正掌握这些功能之后,继续使用更艰难的模块。