我正在将在Yii1中开发的旧应用程序迁移到Yii2.
我以前在控制器中有一个数组,它存储了我需要作为JavaScript发送到前端的所有变量:
public $jsVars;
public function toJSObject($params){
$this->jsVars = array_merge($this->jsVars, $params);
}
private function printJSVarsObject(){
//convert my php array into a js json object
}
Run Code Online (Sandbox Code Playgroud)
当我需要在Javascript中公开变量时,我只想在View或Controller中使用$ this-> toJSObject.
然后,在控制器中我也曾经有过:
public function beforeRender($view){
$this->printJSVarsObject();
}
Run Code Online (Sandbox Code Playgroud)
在Yii2中,我必须使用自定义视图配置View组件,然后附加事件:
namespace app\classes;
use yii\base\Event;
use yii\helpers\Json;
Event::on(\yii\web\View::className(), \yii\web\View::EVENT_END_BODY, function($event) {
$event->sender->registerJSVars();
});
class View extends \yii\web\View {
public $jsVars = [];
public function addJsParam($param){
$this->jsVars = array_merge($this->jsVars, $param);
}
public function registerJSVars() {
$this->registerJs(
"var AppOptions= " . Json::htmlEncode($this->jsVars) . ";",
View::POS_END,
'acn_options'
);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在课堂外举办活动对我来说似乎很奇怪.此外,当我在控制器中时,我将无法使用此方法使用此方法.
显然,我错过了一些东西,或者我的方法是错误的.
你们是怎么做到的?
如果您尝试从视图访问控制器的属性(请参阅上面的注释!),您可以使用;
$this->context
Run Code Online (Sandbox Code Playgroud)
从视图文件中返回当前使用的控制器的实例。因此,要访问您的beforeRender()方法,您只需使用
$this->context->beforeRender()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |