yii2将JS文件注册到View

时间:2014-12-26 11:53:40

标签: javascript class path yii2

我在/views/A/文件夹中有A.php视图文件。 我在/views/A/文件夹中有A.js js文件 请帮我在视图文件中注册js文件。

据我所知,我必须写 视图文件中的$this->registerJsFile('path/to/file.js');

但是(问题A)我从PHPStorm收到method registerJsFile is not found in a class消息。

另外(问题B)考虑到两个文件位于同一文件夹/views/A/中,我应该在路径中写什么?

5 个答案:

答案 0 :(得分:14)

这不是很优雅,但是如果你需要在jquery之后注册你的js文件(如Yii2文档中所示)

<?php $this->registerJsFile(Yii::$app->request->baseUrl.'/js/youFile.js',['depends' => [\yii\web\JqueryAsset::className()]]); ?>

答案 1 :(得分:7)

如果您通过以下方式注册js文件:

$this->registerJsFile("@web/js/all.js");

这将有效,但您将无法使用jQuery。因为在jQuery之前加载了这个文件all.js。要在jQuery之后加载,我们将其依赖于'yii\web\YiiAsset'\yii\web\JqueryAsset。所以它将在jQuery.js之后加载。例如:

$this->registerJsFile("@web/js/all.js",[
    'depends' => [
        \yii\web\JqueryAsset::className()
    ]
]);

那么\yii\web\JqueryAsset\yii\web\YiiAsset之间有什么区别?

jQueryAsset中,js文件将在jQuery.js之后加载,在YiiAsset中,js文件将在yii.js文件之后加载。

如果您想创建自己的自定义资产包:

<?php 
namespace frontend\components;
use yii;

use yii\web\AssetBundle;
class CustomAssets extends AssetBundle
{
    public $css = [
        "path/to/css/file.css"
    ];
    public $js = [
        "path/to/js/file.js"
    ];
    public $depends = [
    ];
}

答案 2 :(得分:6)

有没有具体的理由手动包含文件而不是创建资产包?

在任何情况下,如果您已阅读documentation regarding assets,您会注意到来源已发布的明显区别和外部资产。

最重要的部分是 source 发布的资产使用不同的选项来确定是否以及如何发布文件。

在您的情况下,您有一个来源资产,需要将其复制到资产目录。

registerJsFile调用为hinted in the documentation,预计已发布资产。

这里有两个选项,第一个可能更快更连贯:

  1. 移动web/文件夹中的资源,如web/js/或您喜欢的任何内容,并继续使用registerJsFile()
  2. 来源资产添加新资产包,并指定上述链接页面中详述的各种选项。
  3. 希望这能解决问题。

答案 3 :(得分:4)

在给定的职位上注册您的js文件

$this->registerJsFile('path/to/file.js', ['position' => \yii\web\View::POS_END]);

第一个参数是我们想要插入页面的实际JS代码。第二个参数确定脚本应插入页面的位置。可能的值有:

  

查看头部的POS_HEAD。

     

打开后立即查看:: POS_BEGIN。

     

在关闭前查看:: POS_END。

     

View :: POS_READY,用于在文档就绪事件上执行代码。

这将自动注册jQuery。 View :: POS_LOAD用于在文档加载事件上执行代码。这将自动注册jQuery。 最后一个参数是一个唯一的脚本ID,用于标识代码块并用相同的ID替换现有的代码块,而不是添加新的代码块。如果您不提供,则JS代码本身将用作ID。

可以添加外部脚本,如下所示:

$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]);

registerJsFile()的参数类似于registerCssFile()的参数。在上面的示例中,我们使用依赖于JqueryAsset的main.js文件进行注册。这意味着将在jquery.js之后添加main.js文件。如果没有此依赖关系规范,main.js和jquery.js之间的相对顺序将是未定义的。

答案 4 :(得分:1)

答:来自文档:http://www.yiiframework.com/doc-2.0/yii-web-view.html 你的代码似乎是正确的。

您是否从视图文件本身注册了js?不是控制器? registerJsFile()方法来自视图类。

您的IDE很可能找不到该方法,您是否已在apache环境中尝试过它?

B:使用别名