0

我有一个从像“/js/someFile.js”这样的url访问的javascript文件。但是我希望 Yii 在请求时呈现 javascript 文件,以便我可以在其中包含相关数据,例如来自数据库表的解析列表。

我知道一种解决方案是让文件保持静态,并在初始化时从服务器请求数据,但是我希望不要这样做。

有谁知道如何在不将 JS 内联到当前视图中的情况下实现这一点?或者为什么这是一个糟糕的主意?

4

2 回答 2

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');
   }
}

你甚至可以为它定义一个重写规则,这样你的 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...
   }
}
于 2013-04-22T04:48:54.073 回答
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
);
?>
于 2013-04-22T07:36:40.230 回答