我有一个从像“/js/someFile.js”这样的url访问的javascript文件。但是我希望 Yii 在请求时呈现 javascript 文件,以便我可以在其中包含相关数据,例如来自数据库表的解析列表。
我知道一种解决方案是让文件保持静态,并在初始化时从服务器请求数据,但是我希望不要这样做。
有谁知道如何在不将 JS 内联到当前视图中的情况下实现这一点?或者为什么这是一个糟糕的主意?
我有一个从像“/js/someFile.js”这样的url访问的javascript文件。但是我希望 Yii 在请求时呈现 javascript 文件,以便我可以在其中包含相关数据,例如来自数据库表的解析列表。
我知道一种解决方案是让文件保持静态,并在初始化时从服务器请求数据,但是我希望不要这样做。
有谁知道如何在不将 JS 内联到当前视图中的情况下实现这一点?或者为什么这是一个糟糕的主意?
您可以拥有一个名为 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');
}
}
你甚至可以为它定义一个重写规则,这样你的 url 就可以有 .js 扩展名。
接下来,从您的控制器中说:
class SiteController extends Controller {
public function actionIndex() {
// register the script
Yii::app()->clientScript->registerScriptFile($this->createUrl('js/some_action'));
// do other things here...
}
}
您可以呈现 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
);
?>