2013-02-09 23 views
5

Khi chuyển dữ liệu sang điều khiển tùy chỉnh, tôi luôn sử dụng đối tượng hỗn hợpData để truy cập dữ liệu này từ bên trong điều khiển. Điều này làm việc tốt, ngoại trừ sự kiện beforeRenderResponse của điều khiển tùy chỉnh. Hãy mã này là một ví dụ:compositeData của điều khiển tùy chỉnh không được xác định trong sự kiện beforeRenderResponse

<xp:this.afterPageLoad><![CDATA[#{javascript:getComponent("lbl0").setValue(typeof(compositeData));}]]></xp:this.afterPageLoad> 
<xp:this.beforeRenderResponse><![CDATA[#{javascript:getComponent("lbl1").setValue(typeof(compositeData));}]]></xp:this.beforeRenderResponse> 
<xp:label value="" id="lbl0"/> 
<xp:label value="" id="lbl1"/> 

Trong trường hợp afterPageLoad, các typeof của compositeData là "com.ibm.xsp.binding.PropertyMap". Tuy nhiên, trong sự kiện beforeRenderResponse, cùng kiểu typeof trả về "undefined".

Tôi làm cách nào để truy cập vào tệp compositeData trong sự kiện beforeRenderResponse?

+0

Hãy thử tính toán beforeRenderResponse về "tải trang" để sử dụng $ thay vì # () –

+0

Khi tôi tính toán sự kiện tải trang, tôi gặp lỗi: "getComponent() is null". Dù sao, tính toán chỉ trên tải trang không thực sự là một lựa chọn trong trường hợp của tôi bởi vì tôi muốn làm mới một phần điều khiển tùy chỉnh khi các tham số của nó thay đổi. –

+0

Dựa trên quan sát của tôi, điều này cũng xảy ra không chỉ cho compositeData mà còn cho currentDocument và các nguồn dữ liệu khác được định nghĩa trong xpage. – rfk

Trả lời

6

Trong beforePageLoad hoặc afterPageLoad tạo một biến SSJS với một tham chiếu đến compositeData:

<xp:this.beforePageLoad> 
    <![CDATA[#{javascript: 
     var hlp=compositeData; 
    }]]> 
</xp:this.beforePageLoad> 

Điều này cho phép bạn truy cập vào PropertyMap trong giai đoạn Rendering. Nếu bạn có một tài sản kiểm tra bạn có thể sau đó acces nó theo cách này:

<xp:this.afterRenderResponse> 
    <![CDATA[#{javascript: 
     print(hlp.test); 
    }]]> 
</xp:this.afterRenderResponse> 

EDIT: này chỉ hoạt động nếu trang được mở ra (PageLoad). Nếu bạn làm mới trang, điều này sẽ không hoạt động. Nếu nó phải chạy với refreshs một phần, bạn phải làm điều này:

Trước tiên, bạn cần phải thêm một ID để điều khiển tùy chỉnh của bạn:

<xc:ccWithId test="I am your property" id="ccWithId" /> 

Điều này cho phép bạn truy cập vào điều khiển tùy chỉnh như một thường xuyên thành phần với getComponent(). Bây giờ bạn có thể truy cập vào propertyMap của các thành phần trong trường hợp điều khiển tùy chỉnh của mà giữ biến bạn muốn:

<xp:this.beforeRenderResponse> 
    <![CDATA[#{javascript: 
     var cmp:com.ibm.xsp.component.UIIncludeComposite = getComponent("ccWithId"); 
     print("Value of 'test' -> " + cmp.getPropertyMap().getString("test")) 
    }]]> 
</xp:this.beforeRenderResponse> 

EDIT bởi xpages-Noob: Ví dụ từ trên cao hoạt động tốt đối với tài sản điều khiển tùy chỉnh tĩnh. Tuy nhiên, trong trường hợp một thuộc tính được tính toán, các hàm nhận được khác nhau của bản đồ thuộc tính trả về một đối tượng ràng buộc giá trị thay vì giá trị của chính nó. Do đó, người ta có thể sử dụng chức năng sau đây là một cách giải quyết:

var thisData:com.ibm.xsp.binding.PropertyMap=getComponent("ccWithId").getPropertyMap(); 
function getPara(key) { 
    var x=thisData.get(key); 
    if (@Ends(typeof(x),"ValueBinding")) return x.getValue(facesContext); 
    else return x 
} 

Nếu bạn muốn, ví dụ, có tài sản "test", gọi getPara ("test"). Giá trị trả về phải bằng compositeData.test.

+0

Tôi đã thử trước đó, nhưng mẹo này chỉ hoạt động lần đầu tiên trang tải. Khi tôi làm mới một phần điều khiển tùy chỉnh, typeof của biến helper (hlp) lại không được xác định, có lẽ vì "var hlp = compositeData;" không được thực hiện trong quá trình làm mới và hlp không còn tồn tại nữa. –

+0

Không nhận thấy phần 'làm mới một phần' câu hỏi của bạn. Tôi đã cập nhật câu trả lời của mình. –

+0

Cảm ơn rất nhiều vì giải pháp của bạn. Mặc dù tôi không hiểu tại sao compositeData không có sẵn trong sự kiện beforeRenderResponse, nhưng nó hoạt động tốt ngay bây giờ. Tôi hy vọng bạn không nhớ rằng tôi đã thêm một vài dòng vào câu trả lời của bạn mô tả trường hợp các thuộc tính của điều khiển tùy chỉnh không tĩnh. –