2012-02-02 20 views
5

Tôi biết câu hỏi này đã được hỏi nhiều lần, cả ở đây và trong trang Yii, nhưng tôi không nhận được giải pháp ngay cả sau khi trải qua từng giải pháp. Tôi chắc chắn rằng tôi đang làm một cái gì đó về cơ bản sai. Vì vậy, nếu bạn vẫn đọc sách này - ở đây không có gì,Yii - jQuery không hoạt động sau khi renderPartial

Tôi có một trang có tiện ích CheckBoxList đang được tải. Nó có một thay đổi() jQuery gọi hàm làm mới một CGridView hoạt động hoàn hảo tốt. Tôi cũng có một khoảng liên quan đến mỗi mục trong checkBoxList có một sự kiện nhấp chuột.

sự kiện nhấp chuột này, đến lượt nó gọi một bộ điều khiển mà "một phần làm cho" một cái nhìn -

Yii::app()->clientscript->scriptMap['jquery.js'] = false; 


$this->widget('ext.xxx.EModelWidget', array(
'name' => $widget_name, 
'manufacturer_id' => $manufacturer_id, 
    ) 
); 

Và mã phụ tùng tương ứng in một CheckBoxList sau khi lấy $ dữ liệu từ db.

echo CHtml::checkBoxList($this->name, array(), $data, array(
     'class' => 'modelFilter', 
     'separator' => '', 
     'template' => '<div>{input} {label}</div>', 
     'id' => 'dummyID', 
    )); 

Như bạn thấy đấy, tôi đã đặt tên lớp cho mỗi phần tử đó sẽ được trả lại như một hộp kiểm để được modelFilter

Bây giờ tôi có một kịch bản trong các tập tin giao diện chính để chỉ hiển thị một hộp cảnh báo khi hộp kiểm của lớp modelFilter được nhấp vào.

Yii::app()->clientScript->registerScript('model-selected', " 
$('input.modelFilter').change(function(){ 
    alert('Hellpo!'); 
    }); 
"); 

Nhưng thật không may, điều này không bao giờ xảy ra.

Hai giải pháp chung mà tôi đã đọc trong tất cả các diễn đàn là

a) Yii :: app() -> clientscript-> scriptMap [ 'jquery.js'] = false; mà bạn có thể thấy rằng tôi đã theo dõi hợp lệ.

b) $ result và $ processOutput tham số của renderPartial là sai và đúng tương ứng., cũng là thứ mà tôi đã theo dõi.

Vì vậy, câu hỏi của tôi là những gì tôi nên làm gì để chỉ nhận được chức năng thay đổi trên một nội dung được tải thông qua Ajax làm việc, trong Yii !!

+0

Theo như tôi hiểu ... sự kiện nhấp cũng kích hoạt yêu cầu AJAX? Nếu đây là trường hợp bạn có thể kiểm tra xem có JavaScript jQuery bao gồm trong phản hồi không? Nếu vậy, điều này có thể reinitialize jQuery của bạn và mess lên logic JavaScript của bạn, mặc dù bạn sẽ có thể vô hiệu hóa điều này bằng cách thiết lập processOutput để 'false'. – schmunk

Trả lời

7

Nếu tôi hiểu chính xác, bạn đang gọi $('input.modelFilter').change() trước khi bạn tải danh sách hộp kiểm. Được sử dụng như vậy, trình xử lý sự kiện sẽ không bị ràng buộc với bất kỳ phần tử nào được chèn sau cuộc gọi.

Bạn phải sử dụng các sự kiện được ủy quyền thay vì các sự kiện ràng buộc trực tiếp. Hãy xem tại địa chỉ: http://api.jquery.com/on/ (tìm kiếm cho "trực tiếp và các sự kiện giao")

$("body_or_input_container").on("change", "input.modelFilter", function(e){ 
    //callback 
}); 
+0

Có vẻ đầy hứa hẹn. Hãy để tôi kiểm tra điều này và liên hệ lại với bạn! Cảm ơn bạn đã trả lời !! –

+0

Người đàn ông, bạn là vị cứu tinh! –

0

OK, trên giải pháp mà tôi tìm thấy, có thể là vô tình, là bao gồm tập lệnh jQuery cho tệp được hiển thị một phần, trong tệp được hiển thị một phần.

Tôi muốn biết nếu kiểu này là chính xác, mặc dù.

+0

Nhưng tôi không thấy đây là giải pháp tốt. Tôi thậm chí không thể cập nhật GridView trên trang xem chính !! : ( –

4

Tôi đã có một vấn đề tương tự, sau khi tôi thực hiện một cuộc gọi Ajax mà trở lại một HTML rendered phần với javascript bên trong (tự động tạo ra bởi CActiveForm Yii của) mọi thứ đã bị hỏng vì không có plugin jQuery nào được nhận dạng nữa.Sau một nghiên cứu dài, tôi thấy rằng một phần là gửi lại jQuery lib và nó tự khởi động lại bằng cách "quên" mọi thứ đã được khởi tạo trước đó (đặc biệt là các plugin khác, trong trường hợp của tôi là hộp thoại UI). Sửa chữa duy nhất là yêu cầu Yii không bao gồm chính jQuery.js một phần nhưng hãy bao gồm các tệp JS khác.

Vì vậy, hãy đặt điều này ở đầu phần.

Yii::app()->clientscript->scriptMap['jquery.js'] = false; 

Lưu ý rằng bạn phải định cấu hình để tải jQuery một lần khi tải trang.

+0

Cảm ơn rất nhiều, tôi đã gặp phải vấn đề tương tự. một khuôn khổ kỳ lạ. – Magicode

0

Trong trường hợp mắt renderPartial nó phá hủy các đối tượng hiện có của javascript

ví dụ

Tôi có một mẫu với xác nhận mùi tây j của nó hoạt động một cách hoàn hảo khi chúng tôi sử dụng render() nhưng không nhận ra đối tượng rau mùi tây . vì vậy chúng tôi cần phải khởi tạo lại đối tượng một lần nữa trong trường hợp của tôi là

$ ("# form"). parsley();