Tôi tạo ra một widget mà đăng ký kịch bản riêng của mình như dưới đâyBuộc Script thứ tự từ registerScript Phương pháp trong Yii
class MyWidget extends CWidget {
public function run(){
Yii::app()->clientScript->registerScript(__CLASS__, <<<JAVASCRIPT
var a = "Hello World!";
JAVASCRIPT
, CClientScript::POS_END);
}
}
Và trong cách bố trí, tôi gọi là phụ tùng như thế này
<?php $this->widget('MyWidget');?>
<?php echo $content;?>
Nhưng trong một xem tập tin, tôi cần biến được khai báo bởi widget đó.
<?php
Yii::app()->clientScript->registerScript('script', <<<JAVASCRIPT
alert(a);
JAVASCRIPT
, CClientScript::POS_END);
?>
Lưu ý rằng trong cả hai phương pháp registerScript tôi sử dụng POS_END như vị trí kịch bản kể từ khi tôi có ý định đặt tất cả các kịch bản (bao gồm cả CoreScript ví dụ jQuery, jQueryUI vv) sau thẻ <body>
.
Vấn đề là tập lệnh được hiển thị sẽ hiển thị tập lệnh từ tệp xem và sau đó là tệp từ tiện ích con.
alert(a);
var a = "Hello World!";
Như chúng ta có thể thấy, mã trên sẽ không hoạt động nên tôi cần đặt dòng thứ hai phía trên dòng đầu tiên.
Bất kỳ ý tưởng nào về cách buộc thứ tự? Tôi đồng ý với việc mở rộng CClientScript
(và tạo phương thức registerScript
mới) miễn là tất cả các tập lệnh sẽ được hiển thị ở vị trí cuối và tôi không phải lấy các mã Javascript nội tuyến ở trên vào một gói hoặc tệp mới.
ý định của tôi là vẽ tất cả các kịch bản ở cuối dòng. Vấn đề là kịch bản trong widget phụ thuộc vào jQuery, và tôi đặt tất cả các coreScripts vào cuối bằng cách thiết lập trường 'coreScriptPosition' (http://www.yiiframework.com/doc/api/1.1/CClientScript#coreScriptPosition- chi tiết) dưới dạng POS_END. –
Vâng, U có ý tưởng tồi hoặc U phải chia khai báo var thành HEAD, phần thân của tập lệnh widget ot END hoặc U phải thay đổi END thành READY: Yii :: app() -> clientScript-> registerScript ('script' , <<< JAVASCRIPT cảnh báo (a); JAVASCRIPT , CClientScript :: POS_READY); – Sergey