2012-12-03 55 views
0

背景:具有选项卡式表格(来自容器控件)和多个数据源的XPage,每个选项卡一个。如果用户刷新页面,我遇到了保存按钮创建重复的问题。为了解决这个问题,我实施了Tommy Valand创建的这个解决方案。 http://dontpanic82.blogspot.com/2010/06/xpages-avoid-saving-duplicate-documents.html需要将URL指向xpages中选项卡式表的第二个选项卡

问题是,当用户在第二个选项卡上,并使用全面刷新(我必须有这个由于附件)保存文档。该功能很好,除了...

问题:重定向总是把用户带到第一个选项卡。除了第一个选项卡外,这对每个选项卡显然都是一个问题。

我想知道一种方法将URL直接导向到第二个选项卡。我试图修改Tommy的代码来包含一个哈希标记,但我一直无法得到这个工作。我甚至不确定散列标签是否可以与xpages一起使用。在此先感谢帮助解决此问题。

function redirectToCurrentDocument(switchMode:boolean, tab){ 
    try { 
    if(typeof currentDocument === 'undefined' || viewScope.stopRedirect){ return;  } 
    // Gets the name of the XPage. E.g. /Person.xsp 
    var page = view.getPageName(); 

    // Finds extra parameters, strips away XPages parameters/trims leading & 
    var parameters = context.getUrl().getQueryString().substring(1); 
    var extraParameters = parameters.replace( 
    /([&\?^]*_[a-z0-9=]+[&]{0,1})|(action=\w{4}Document[\&]{0,1})|(documentId=[\w]{32}[\&]{0,1})/ig, '').replace(/\&$/, ''); 

    // Gets the unid of the current document 
    //var unid = currentDocument.getDocument().getUniversalID(); 
    //var unid = document1.getDocument().getUniversalID(); //changed this line to make work with multiple data sources - SJZ 
    var unid = document1.getDocument().getNoteID(); //also changed to use NoteID since it gave runtime errors for new documents - SJZ 

    // Sets/changes the action according according to the mode the document is in 
    var isEditable = currentDocument.isEditable(); 
    if(switchMode){ isEditable = !isEditable; } // false -> true/true -> false 

    var action = (isEditable) ? 'editDocument' : 'openDocument'; 

    // Open the current document via a get request 
    var redirectUrl = page + '?documentId=' + unid + '&action=' + action; 

    if(extraParameters){ redirectUrl += '&' + extraParameters; } 

    print("tab=" + tab) 
    if(tab == "Invoices") { redirectUrl += '#tabPanel1'; } 
    if(tab == "Credits") { redirectUrl += '#view:_id1:tabPanel2:editPanelCredits'; } 
    print(redirectUrl); 
    context.redirectToPage(redirectUrl); 
    } catch(e){ /* Exception logging */ } 
} 
+0

使用getComponent()与组件交互,而不是'#view:_id1:tabPanel2:editPanelCredits'。还有一个范围变量来设置哪个标签应该是活动的。 –

+0

只是一个提示:在URL中使用param(或者像你已经做的那样),并使用OnPageLoad客户端脚本来调用局部刷新来选择选项卡。 –

回答

4

您不能使用#HashTag,因为服务器永远不会从浏览器接收到这些信息。

只需修改侑tabbedPanel通过URL参数来打开所选标签“标签”

<xp:tabbedPanel id="tabbedPanel1"> 
    <xp:this.selectedTab> 
     <![CDATA[#{javascript: 
      var p = context.getUrlParameter("tab"); 
      if( p === "") 
       p = "Invoices"; 

      return p 
     }]]> 
    </xp:this.selectedTab> 
    <xp:tabPanel label="New Tab" id="Invoices"> 
     TAB1 Invoices 
    </xp:tabPanel> 
    <xp:tabPanel label="New Tab2" id="Credits"> 
     TAB2 Credits 
    </xp:tabPanel> 
</xp:tabbedPanel> 

现在,您可以用打开您的XPage http://example.com/db控制它.nsf/Tab.xsp?tab =积分

的SSJS以上代码现在可以很容易地修改这样的:

... 
print("tab=" + tab) 
redirectUrl += '&tab=' + tab; 
print(redirectUrl); 
.... 

正则表达式必须被修改这种方式:

var extraParameters = parameters.replace( 
/([&\?^]*_[a-z0-9=]+[&]{0,1})|(tab=\w{0,}[\&]{0,1})|(action=\w{4}Document[\&]{0,1})|(documentId=[\w]{32}[\&]{0,1})/ig, '').replace(/\&$/, ''); 

从URL中删除标签参数。

+0

它的作品非常漂亮。谢谢斯文! –

相关问题