【问题标题】:nslXMLHttpRequest.send failing when used in XPiNC在 XP iNC 中使用 nsl XMLHttpRequest.send 失败
【发布时间】:2013-01-09 13:27:37
【问题描述】:

我有一个 iNotes 列表视图对象,其中列出了我想要的文档以及相关的 REST 组件。在“OnSelectEntry”方法中,我有以下代码。

var unid =  items[0]["@unid"];
var myUrl = "test.nsf/main.xsp/docPathInfo/unid/" + unid;

var h;

if (window.XMLHttpRequest){
    h = new XMLHttpRequest();
} else {
    h = new ActiveXObject("Microsoft.XMLHTTP");
}

h.onreadystatechange=function() {
  if (h.readyState == 4 && h.status == 200) {
      var myObject = eval('(' + h.responseText + ')');

      var result = dojo.byId("#{id:inputText1}");
      result.value = myObject.field1 + " " + myObject.field2;

  }
}

h.open("GET",myUrl,false);
h.send();

如果 NSF 托管在服务器上,则此代码可以完美运行,但如果我将它放在本地,则会失败并显示以下内容:

uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nslXMLHttpRequest.send]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: http://127.0.0.1:50113/xsp/.ibmxspres/.mini/dojo/.en/@Wc&@Eab&@Eya&@lu.js :: anonymous :: 

我需要这个在客户端上工作。这是在客户端回电的正确方法吗?

我也尝试过更改 ACL 访问权限,但似乎没有帮助。我也尝试过使用绝对 URL 而不是相对 URL。

[更新]

我尝试更改为 Dojo 调用,如下所示。

var x;
var myCallback = function(data, ioArgs)
{
 var myObject = eval('(' + data + ')');

  var result = dojo.byId("#{id:inputText1}");
  result.value = myObject.field1 + " " + myObject.field2;
}
dojo.xhr("Get", {
url: myUrl,
handleAs: "text",
timeout: 10000,
load: myCallback
});

当我运行此代码时,它在服务器上运行良好,但当我在客户端运行它时,它不起作用。我在 XPages.log 文件中收到以下消息。

1/10/13 10:45 AM: Internal warning: Check access being called outside of a request
1/10/13 10:45 AM: Internal warning: Check access being called without a valid session/database

【问题讨论】:

  • 您是否尝试过改用dojo ajax 函数?您是从非 XPage 调用 XPage 视图 ajax 吗?
  • 我尝试了 Dojo 调用,但这给了我一个不同的错误。我已经更新了文档。
  • 我想我现在明白了一点。你有 nsf 坐在本地,你试图在同一台本地机器上向不同的数据库发出 ajax 请求?除非您的机器上有本地运行的多米诺服务器,否则这将不起作用。除了发出 ajax 请求,也许您可​​以使用 ssjs 通过 XPages 部分刷新来显示您需要的数据?

标签: xpages xpinc


【解决方案1】:

好的,我不确定您将如何在客户端上使用 REST,但您可以进行 XSP.partialRefreshGet() 调用,这应该可以工作。

因此,对于您的代码,您将执行以下操作:

var partialRefreshOptions = { 
    "unid" : items[0]["@unid"]
};

// If you want to do any processing client side.
function partialRefreshOnComplete() {}
function partialRefreshOnStart() {};
function partialRefreshOnError() {};

// Make the call. 
XSP.partialRefreshGet("#{id:someDummyField}", {
    params : partialRefreshOptions,
    onStart : partialRefreshOnStart, 
    onError : partialRefreshOnError, 
    onComplete : partialRefreshOnComplete}
);

然后在您的“someDummyField”中将其设置为计算显示并具有如下代码:

if(!param.isEmpty()){
    // Do something with the param.unid. Alternatively... 
    return param.unid;

} 

有关这方面的推荐阅读,请参阅“XPages Portable Command Guide”,第 176 页。

只是稍微扩展一下,您应该使用 XSP.partialRefreshGet() 而不是 XHR,因为如果没有正确执行 AJAX 调用可能会损坏后端文档。这也记录在同一本书中。

【讨论】:

  • 谢谢!这完美地工作。它也让我的生活更轻松,因为我不再需要清理 eval() 了。我使用计算的数据而不是计算的显示。
猜你喜欢
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2011-08-14
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
相关资源
最近更新 更多