2014-10-21 19 views
7

Tôi đang sử dụng PrimeFaces 5.Phạm vi khung nhìn của khung thoại PrimeFaces có bị phá vỡ so với hộp thoại p: không?

Tôi muốn mở hộp thoại khi nhấn nút.

<p:commandButton value="add upload" actionListener="#{theForm.openUpload}" > 

public void openUpload() { 
    this.item = new Item(); 
    RequestContext.getCurrentInstance().openDialog("uploadForm"); 
} 

Sẽ có một nút lưu trong hộp thoại để lưu các đầu vào.

<h:commandButton value="#{text['button.add']}" id="add" styleClass="btn btn-default" actionListener="#{theForm.confirmAdd}"/> 

public void confirmAdd() { 
    RequestContext.getCurrentInstance().closeDialog("uploadForm"); 
} 

bean được quản lý của tôi là @ViewScoped. Nút lệnh có phá vỡ phạm vi xem nếu hộp thoại nằm trong một tệp ngoài được thực hiện bởi khung thoại PrimeFaces không? Bất cứ khi nào tôi nhấp vào nút "thêm tải lên", phương thức @PostConstruct được gọi lại giống như phạm vi bị mất.

Phần nhận xét của official blog cho biết nó sẽ không phá vỡ phạm vi xem, nhưng here the forum a core developer nói openDialog() tạo chế độ xem mới, do đó, nó sẽ phá vỡ phạm vi xem.

Ai đó có thể xác nhận điều này không?

+0

Bạn sử dụng phiên bản JSF nào? 'Javax.faces.bean.ViewScoped' được biết là phá vỡ trong một số trường hợp. (Xem thêm http://balusc.blogspot.de/2010/06/benefits-and-pitfalls-of-viewscoped.html) Nếu bạn đang sử dụng CDI, bạn nên chuyển sang 'javax.faces.view.ViewScoped' - Điều này đang hoạt động như mong đợi. – dognose

Trả lời

8

PrimeFaces' cơ bản cho thấy một cái nhìn trong một thẻ . Tôi sẽ không gọi là phá vỡ một phạm vi xem, nhưng khung nhìn hộp thoại sẽ có phạm vi riêng của nó, bởi vì nó thực sự là một trang khác. Điều đó có thể hoặc có thể không được mong muốn trong các trường hợp khác nhau. Như tài PrimeFaces' Hướng dẫn nói:

Dialog Framework (DF) được sử dụng để mở một trang xhtml bên ngoài trong một thoại được tạo ra tự động trên runtime.

  • p: thoại
    • Tồn tại trong phạm vi tầm nhìn tương tự.
    • Có thể dễ dàng có cùng ngữ cảnh trò chuyện.
    • Được xác định tĩnh, hộp thoại và các thành phần của hộp thoại được tạo ngay lập tức trên chế độ xem bản dựng. Bạn chỉ có thể trì hoãn hiển thị, ví dụ: với số dynamic=true.
    • Định nghĩa khai báo có nghĩa là nó dễ đọc và dễ bảo trì hơn, vì sự tồn tại của hộp thoại không bị ẩn ở đâu đó trong mã java.
  • Khung thoại.
    • Có phạm vi xem riêng.
    • Nhà phát triển phải lo lắng về việc truyền tham số, tuyên truyền ngữ cảnh hội thoại. (Và PF không hỗ trợ includeViewParams cho đến 5.1.)
    • Hộp thoại tạo động và các thành phần của nó sẽ không được tạo cho đến khi hộp thoại thực sự được mở, nhưng hộp thoại mới sẽ được tạo mỗi lần mở. Nếu hộp thoại được mở nhiều lần, tổng hiệu suất đạt sẽ lớn hơn, cộng với nhiều lượt xem hộp thoại có thể làm cạn kiệt giới hạn chế độ xem JSF và hết hạn các chế độ xem khác.
    • Tạo động bắt buộc cho phép hiệu quả tài nguyên hơn trong một số trường hợp nhất định. Ví dụ. hiển thị một hộp thoại cụ thể trong số hàng tá dựa trên đầu vào của người dùng. Hoặc một hộp thoại hiếm khi được sử dụng, có thể được mở từ bất kỳ trang nào của ứng dụng.

Đề xuất của tôi sẽ sử dụng hộp thoại p: theo mặc định. Chỉ sử dụng Hộp thoại trong các trường hợp như tôi đã đề cập ở điểm bullet cuối cùng.

+0

thông tin rất hữu ích! Tôi kết thúc bằng cách sử dụng p: thoại vì phù hợp với yêu cầu của tôi :) – Kossel

1

Điều đó là bình thường vì bạn đã khởi tạo tệpForm (ManagedBean) trong tệp main.xhtml của mình. SO phạm vi đã được sử dụng trong main.xhtml. Khi bạn nhấp để mở hộp thoại: hộp thoại là chế độ xem mới, sau đó một phiên bản mới của tệpForm (ManagedBean) được tạo.

0

Chúng tôi đã có một số vấn đề với @ViewScoped trong JBoss 7.1/Mojarra 2.1.7 và chúng tôi thay đổi để Omnifaces

tôi đề nghị bạn sử dụng @org.omnifaces.cdi.ViewScoped thay vì @javax.faces.bean.ViewScoped

Tôi đã thử nghiệm với cả hai ví dụ của bạn và đây trên đăng nhập bạn sẽ nhìn thấy Sự khác biệt:

Đăng nhập với @org.omnifaces.cdi.ViewScoped

18:58:40,887 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-2) @postconstruct 
18:58:40,890 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-2) openUpload() 

Đăng nhập với Dialog Khung @javax.faces.bean.ViewScoped

19:01:19,753 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-5) @postconstruct 
19:01:19,753 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-5) @postconstruct 
19:01:19,754 INFO [xxx.TheForm] (http-localhost-127.0.0.1-8080-5) openUpload() 
+3

Stackoverflow không phải là một diễn đàn * mà bạn có thể chiếm đoạt một số chủ đề. Stack overflow là một trang web * Q & A *, nơi nó được intenet để có ** ONE ** câu hỏi và nhiều câu trả lời cho mỗi * trang * - Vui lòng nêu câu hỏi của riêng bạn, ngay cả khi nó rất giống với bài viết này! – dognose

+2

Tôi nghĩ anh ta không cướp chủ đề, anh ta đề nghị tôi sử dụng một gói khác vì anh ấy gặp phải cùng một vấn đề – Kossel

+1

@Kossel trông giống như một quesiton (Chúng tôi có cùng một vấn đề), nhưng bạn có thể đúng. – dognose

Các vấn đề liên quan