我有一个从“/js/someFile.js”这样的网址访问的javascript文件。但是我希望Yii在请求时呈现javascript文件,这样我就可以在其中包含相关数据,例如数据库表中的已解析列表。
据我所知,一个解决方案就是让文件保持静态,并在初始化时从服务器请求数据,但我希望不要这样做。
有没有人知道如何在不将JS内联放在当前视图中的情况下实现这一目标?或者为什么这是一个可怕的想法?
答案 0 :(得分:1)
你可以有一个名为js或javascript的特殊控制器并调用它而不是调用静态js文件:
class JsController extends Controller{
public function init() {
header('Content-Type: application/javascript');
}
public function actionSome_action(){
$this->render('some_action_view_file');
}
}
您甚至可以为其定义重写规则,以便您可以为您的网址设置.js扩展名。
接下来,从您的控制器中说:
class SiteController extends Controller {
public function actionIndex() {
// register the script
Yii::app()->clientScript->registerScriptFile($this->createUrl('js/some_action'));
// do other things here...
}
}
答案 1 :(得分:1)
你可以呈现视图,如Twisted1919所示。但我确实认为通过Yii呈现javascript并不是一个好主意。你的问题已经暗示,javascript文件几乎是静态的。因此,将其视为静态文件,以便您的网络服务器可以更快地为其服务。并且在客户端缓存此文件更容易。
然后,如您所建议尝试以某种方式编写它,您只需将动态部分作为参数传递给您的javascript。但是,您不必像隐含的那样从服务器请求数据。您可以将内嵌配置添加到页面中:
<?php
$data = json_encode(array(
'userId' => Yii::app()->user->id,
'whatever' => $someThing,
));
Yii::app()->clientScript->registerScriptFile('my.js');
Yii::app()->clientScript->registerScript(
'initJs',
"myJs.init($data)",
CClientScript::POS_READY
);
?>