我正在使用IBM Worklight Developer Edition 5.0.5尝试创建简单(HTML和适配器)应用程序,但面临未解决的问题。
这可能是同样的问题,旧论坛没有回答: http://www.ibm.com/developerworks/forums/thread.jspa?threadID=460738
[环境] 操作系统:Windows7 64位(日语语言环境), Eclipse:4.2.1, Worklight:Developer Edition 5.0.5
[说明] 我在Eclipse中创建了Worklight项目,没有任何外部库,如jQuery mobile和Dojo。我在此项目中添加了HTTP适配器和SQL适配器。当我尝试'Run As .. - >时,两者似乎都运行正常。调用Worklight Procedure'。两者都返回了预期的JSON。所以我认为适配器不会出现问题。
但是当我从HTML文件中调用这些适配器时,我得到了“未捕获的TypeError:无法使用'in'运算符来搜索worklight.js中的'SUPPORT_COOKIES'错误(行:2380) )。
[我的代码]
var invocationData = {adapter:'SQLAdapter',procedure: 'getCount',参数:[]};
WL.Logger.debug(“1:invocationData =”+ invocationData);
WL.Client.invokeProcedure(invocationData,{onSuccess: loadFeedsSuccess,onFailure:loadFeedsFailure});WL.Logger.debug(“2:loadFeeds”);
function loadFeedsSuccess(result){WL.Logger.debug(“3:成功: result =“+ result);}
function loadFeedsFailure(result){WL.Logger.debug(“4:失败: result =“+ result);}
[我的调试控制台输出]
1:invocationData = [object Object] worklight.js:1112
未捕获的TypeError:无法使用'in'运算符进行搜索 “SUPPORT_COOKIES”在null worklight.js:2380
wlclient init启动了worklight.js:1112
之前:app init onSuccess worklight.js:1112
之后:app init onSuccess worklight.js:1112
wlclient init success
所以似乎只有第一个WL.Logger.debug()成功调用,但WL.Client.invokeProcedure()似乎导致上面的未捕获的TypeError ,它只是失败了(没有调用成功 - 大小写回调,也没有故障情况回调)。
这是一个SQL Adapter案例,但是当我尝试使用HTTP Adapter时,结果是相同的(在WL.Client.invokeProcedure()中失败)。再次,当我尝试'Run As .. - >时,两者都返回适当的结果。调用Worklight Procedure'。
我的控制台说这次失败发生在worklight.js的第2380行:
2379:isEnabled:function(field){
2380:return !!(简介中的字段&& profile [field]);
2381:}
所以我不知道我的代码会出现什么问题。这个问题有什么想法/信息吗?谢谢你的进步。
加 在Mac OSX环境中也发生了同样的错误。
答案 0 :(得分:2)
我找到了导致我问题的原因。
访问适配器时,我使用< script>直接编辑了HTML文件中的javascript。标签位于自动生成的< script>的最底部标签,并试图创建初始页面。我认为这不适合Worklight。我不确定到底出了什么问题,但我的javascript代码可以在准备好之前加载。
现在我改变了我的代码。 我将我的javascript(曾经是HTML内部)移动到(Projectname).js 中wlCommonInit()函数的最底层。目前它似乎工作正常,没有像以前那样的错误消息,并通过适配器检索预期的信息。这可能是一种合适的方式。
答案 1 :(得分:1)
调用Worklight API WL.Client.invokeProcedure 和 WL.Logger.debug 只有在调用wlCommonInit后才会发生。
wlCommonInit 驻留在应用程序的主JavaScript文件中(your-project \ your-application \ js \ application-name.js)。
答案 2 :(得分:1)
要解决此类问题,我们需要检查何时调用第一个适配器调用。我们需要延迟适配器调用一段时间,如1000ms。然后您的应用程序将按您喜欢的方式运行。
setTimeout(function(){
$(document).ready(function() {
var invocationData = {
adapter : 'Contract',
procedure : 'GetDropDownListForLogin'
};
console.log("Invocation data:" +invocationData);
var options = {
onSuccess : OnLogindataSucess,
onFailure : OnLoginFail,
};
WL.Client.invokeProcedure(invocationData,options);
});
},1000);
请使用以下方式让第一个适配器调用它来解决您的问题。