2013-07-03 33 views
8

Tôi đang cố gắng mở rộng một số chức năng của một portlet Liferay hiện có. Là một phần của điều này, tôi muốn sử dụng giao diện người dùng hợp kim để sửa đổi giá trị của một trường trong portlet. Có một khối <aui:script> đã tồn tại từ trước nơi tôi muốn xác định chức năng tùy chỉnh của mình. Tôi đã đi trước và thử sử dụng A.one('element'), nhưng tôi nhận được lỗi "A không được xác định". A.one() được sử dụng ở nơi khác trong cùng một tệp .jsp, mặc dù không nằm trong khối <aui:script> và hoạt động như mong đợi."A không được xác định" bên trong của <aui:script> khối

Tôi đã cố gắng giải quyết vấn đề này cho Google. Một giải pháp mà tôi đã thử là đưa câu lệnh "use" vào khối phần tử, nhưng điều này làm cho tất cả các hàm trong khối đó không được xác định khi được gọi từ jsp.

Những gì tôi có nghĩa là do "sử dụng" tuyên bố là thế này:

<aui:script use="aui-node,aui-base"> 
    // ... script 
</aui:script> 

Dưới đây là một phác thảo sơ bộ những gì tôi đang cố gắng để làm:

<aui:script> 
    function save(){ 
     // This is where I'm getting the 'A is not defined' error. 
     var titleNode = A.one('input[name=title]'); 

     if (titleNode) { 
      // do stuff with titleNode 
      var titleVal = titleNode.val(); 
      var titleSubstr = titleVal.substring(0, titleSubstr.lastIndexOf('/')); 
      titleNode.val(titleSubstr); 
     } 

     // other save-related code here 
    } 

    function otherFunction() { 
     // some other functionality 
    } 
</aui:script> 
+1

Tôi không biết nhiều về "AUI" nhưng bạn vẫn có thể "document.getElementsByName (" title ") [0] .value" để nhận giá trị phần tử –

Trả lời

7

<aui:script> thẻ đầu ra

AUI().use(function(A) { 
} 

chỉ nếu bạn cung cấp phụ thuộc qua use thuộc tính. Giống như

<aui:script use="aui-base"> 
    // your code here 
</aui:script> 

Nếu bạn làm như vậy, bạn sẽ phải

<script type="text/javascript"> 
    AUI().use('aui-base', function(A) { 
     // your code here 
    } 
</script> 

như một kết quả. Nhưng trong trường hợp này, tất cả các hàm bạn khai báo bên trong sẽ không toàn cục. Để làm cho họ cuộc gọi toàn cầu

Liferay.provide(window, 'functionName', function() { 
    // function body 
}); 

bên <aui:script/>

Cũng <aui:script use="aui-base"/> là tốt hơn so với tay gọi AUI().use(function(A) {}) nếu khách hàng có thể có IE < = 7, điều đó không làm việc một cách chính xác với AUI().use(). Trong trường hợp IE 6,7 <aui:script use="aui-base> sẽ xuất ra AUI().ready('aui-base', function(A) {}); sẽ hoạt động trong các trình duyệt cũ.

+0

Câu trả lời tuyệt vời và chi tiết! – jbalsas

+0

Tôi chưa thử nghiệm điều này, nhưng điều này có vẻ như nó sẽ sửa chữa chính xác vấn đề của tôi. Cảm ơn nhiều! –

0

Các blog post here đưa ra một giới thiệu tốt để AUI. Đặc biệt, các đoạn trích sau đây từ đầu những bài trả lời câu hỏi trực tiếp của bạn:

How do you create a sandbox? 

Simple: 

AUI().use(function(A) { 
    // Your code goes here 
}); 
+0

Tôi giả định rằng thẻ đặt sandbox cho tôi. Ngoài ra, "A" được tham chiếu ở nơi khác trong cùng một tệp mà không gọi rõ ràng là 'AUI(). Use' ... và nó hoạt động như mong đợi. –