首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值从弹出portlet发送回父portlet。

将值从弹出portlet发送回父portlet。
EN

Stack Overflow用户
提问于 2014-09-26 09:54:47
回答 1查看 3K关注 0票数 1
  1. 父portlet有一个表单,我填写了,但尚未提交。
  2. 然后,在这个父portlet中,我单击一个链接打开一个弹出portlet,在其中填充弹出的表单并提交值。
  3. 这个值现在应该可以在父portlet中使用。但是,如果不刷新,则父portlet中的值不可用。
  4. 因此,我使用ajax编写了在弹出提交时刷新父portlet的逻辑,该值将在父portlet中可用。
  5. 但是问题是父portlet中的表单被清除了,我必须再次填充表单。

那么,如何保存尚未提交的父窗体值呢?或者,是否有一种方法可以使弹出的portlet值在父portlet中可用,而无需刷新父portlet?

父portlet的代码:

代码语言:javascript
复制
<aui:form action="<%= editURL %>" method="POST" name="fm">
     <aui:fieldset>
        <aui:input name="redirect" type="hidden" value="<%= redirect %>" />


         <aui:input name="name" />

         <aui:input name="acronym" />

         <aui:input name="url" />

         <aui:select  showEmptyOption="<%= true %>">

              // Want to make the values added from pop up available here

         </aui:select>

         <%
             String portletId = (String) request.getAttribute(WebKeys.PORTLET_ID);
             String portletNamespace = PortalUtil.getPortletNamespace(portletId);
         %>

         <c:set var="portletNameSpaceVal" value="<%=portletNamespace%>" />

         <liferay-portlet:renderURL 
             var="addURL" windowState="<%= LiferayWindowState.POP_UP.toString() %>"
             portletName="name">
             <liferay-portlet:param name="jspPage" value="/html/person/edit_person_popup.jsp"/>
         </liferay-portlet:renderURL>

         <c:set var="portletURL" value="<%=addURL%>" />

         <aui:a href="#" onClick="${portletNameSpaceVal}showPopup('${portletURL}')"><liferay-ui:icon image="add"/></aui:a> // this link triggers the pop up


         <aui:select label="Country" name="countryCode" showEmptyOption="<%= true %>">

              <%
                 for (Country country : countries) {
             %>

             <%
                 }
             %>

         </aui:select>




     </aui:fieldset>

     <aui:button-row>
         <aui:button type="submit" />

         <aui:button onClick="<%= viewURL %>"  type="cancel" />
     </aui:button-row>
 </aui:form>


 <aui:script>
     function <portlet:namespace />showPopup(url) {

         var url = url;

             Liferay.Util.openWindow(
                 {
                     dialog: {
                         cache: false,
                         width:800,
                         modal: true,
                         centered: true
                     },
                     id: 'popUpId',                
                     uri: url
                 }
             );
     }

 </aui:script>

 <aui:script>
     Liferay.provide(window, 'refreshPortlet', function() {
         var curPortlet = '#p_p_id<portlet:namespace/>';
         Liferay.Portlet.refresh(curPortlet);
     },
     ['aui-dialog','aui-dialog-iframe']
     );
 </aui:script>

 <aui:script>
     Liferay.provide(window, 'closePopup', function(dialogId) {
         var A = AUI();
         var dialog = Liferay.Util.Window.getById(dialogId);
         dialog.destroy();
     },
     ['liferay-util-window']
     );
 </aui:script>

然后我有了弹出的portlet。

代码语言:javascript
复制
<aui:form action="<%= editURL %>" method="POST" name="fm" onSubmit="event.preventDefault();">
    <aui:fieldset>

        <aui:input name="name" />

        <aui:input name="url" />

        <aui:input name="address" />

    </aui:fieldset>

    <aui:button-row>
        <aui:button type="submit" />

        <aui:button name="cancel" value="Cancel"/>

    </aui:button-row>
</aui:form>

<aui:script use="aui-base,aui-form-validator,aui-io-request">
    AUI().use('aui-base','aui-form-validator','aui-io-request',function(A){
        var rules = {
              <portlet:namespace/>name: {
                required: true
              },

              <portlet:namespace/>url: {
                url: true
              },

              <portlet:namespace/>address: {
                required: true
              },
          };

        var fieldStrings = {
            <portlet:namespace/>name: {
                required: 'The Name field is required.'
              },

              <portlet:namespace/>address: {
                required: 'The Address field is required.'
              },
        };

        new A.FormValidator({
            boundingBox: '#<portlet:namespace/>fm',
            fieldStrings: fieldStrings,
            rules: rules,
            showAllMessages:true,
            on: {
                    validateField: function(event) {
                     },
                    validField: function(event) {
                   },
                    errorField: function(event) {
                    },
                    submitError: function(event) {
                        event.preventDefault(); //prevent form submit
                    },
                    submit: function(event) {
                        var A = AUI();
                        var url = '<%=editURL.toString()%>';

                        A.io.request(
                            url,
                            {
                                method: 'POST',
                                form: {id: '<portlet:namespace/>fm'},
                                on: {
                                    success: function() {
                                        Liferay.Util.getOpener().refreshPortlet();
                                        Liferay.Util.getOpener().closePopup('popUpId');                                        
                                    }
                                }
                            }
                       );
                   }
                }
          });
    });

</aui:script>




<aui:script use="aui-base">
    A.one('#<portlet:namespace/>cancel').on('click', function(event) {
        Liferay.Util.getOpener().closePopup('popUpId);
    });
</aui:script>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-26 12:58:19

我认为你可以这样做:

  1. 您可以以JSON格式从服务器传递数据。
  2. success方法中获取
  3. 将数据传输到父javascript函数
  4. 运行父级中的方法来更新<aui:select>

弹出成功方法中的一些示例代码:

代码语言:javascript
复制
success: function(responseData) {
    // refresh method removed
    // get the responseData as JSON or something from the server
    Liferay.Util.getOpener().updateDataFromPopUp("JSON-data-passed");
    Liferay.Util.getOpener().closePopup('popUpId');                                        
}

在父母中:

代码语言:javascript
复制
<aui:script>
     Liferay.provide(window, 'updateDataFromPopUp', function(jsonDataFromPopUp) {
         // do something with the data here
        }
     );
 </aui:script>

也许还有其他的方法,但这正是我现在所能想到的。

一项建议:

您可以在一个<aui:script></aui:script>中拥有所有函数,而不是多次使用这个函数。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26056820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档