Yii2 регистрация JS файлов в представлении

У меня есть файл просмотра A.php в папке /views/A/. И у меня есть файл A.js js в папке /views/A/ Пожалуйста, помогите мне зарегистрировать файл js в файле.

Как я понимаю, я должен написать $this->registerJsFile('path/to/file.js'); в файле вида.

Но (вопрос A) Я получаю сообщение method registerJsFile is not found in a class из PHPStorm.

Также (вопрос B), что я должен писать в пути, учитывая, что оба файла находятся в одной папке /views/A/?

Ответы

Ответ 1

Есть ли какая-то конкретная причина для включения файла вручную, а не для создания пакета активов?

В любом случае, если вы прочитали документацию относительно активов, вы заметили бы четкое различие в источнике, опубликованные и внешние.

Наиболее важной частью этого является то, что источники и опубликованные активы используют разные параметры для определения того, должен ли и как файл публиковать.

В вашем случае у вас есть исходный актив, который необходимо скопировать в каталог ресурсов.

Вызов registerJsFile как намеченный в документации, ожидает опубликованный актив.

Здесь у вас есть два варианта, которые, вероятно, первые более быстрые и последовательные:

  • переместите актив в папку web/, как в web/js/, или что вы предпочитаете, и продолжайте использовать registerJsFile()
  • добавьте новый пакет активов для ресурсов source, указав различные параметры, как описано на приведенной выше странице.

Надеюсь, это прояснит ситуацию.

Ответ 2

Это не изящно, но работает, если вам нужно, чтобы ваш js файл зарегистрировался после jquery (как видно из документа Yii2)

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

Ответ 3

Если вы зарегистрируете файл js:

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

Это будет работать, но вы не сможете использовать jQuery. Поскольку этот файл all.js загружается перед jQuery. Для загрузки после 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 файла.

Если вы хотите создать свой собственный набор Asset Bundle:

<?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 = [
    ];
}

Ответ 4

A: Из документов: http://www.yiiframework.com/doc-2.0/yii-web-view.html Ваш код выглядит правильно.

Вы регистрируете js из самого файла просмотра? а не контроллер? Метод registerJsFile() относится к классу вида.

Возможно ли, что ваша среда IDE не находит этот метод, попробовали ли вы его в среде apache?

B: Используйте псевдоним

Ответ 5

Зарегистрируйте свой js файл при заданном выполнении

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

Первым аргументом является фактический код JS, который мы хотим вставить на страницу. Второй аргумент определяет, где script следует вставить на страницу. Возможные значения:

Просмотр:: POS_HEAD для раздела главы.

Просмотр:: POS_BEGIN для сразу после открытия.

Просмотр:: POS_END перед закрытием.

View:: POS_READY для выполнения кода в событии готовности документа.

Это автоматически зарегистрирует jQuery. View:: POS_LOAD для выполнения кода при загрузке документа. Это автоматически зарегистрирует jQuery. Последний аргумент - это уникальный идентификатор script, который используется для идентификации блока кода и замены существующего с тем же идентификатором вместо добавления нового. Если вы не предоставите его, сам код JS будет использоваться как идентификатор.

Внешний script можно добавить следующим образом:

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

Аргументы для registerJsFile() аналогичны аргументам registerCssFile(). В приведенном выше примере мы регистрируем файл main.js с зависимостью от JqueryAsset. Это означает, что файл main.js будет добавлен ПОСЛЕ jquery.js. Без этой спецификации зависимости относительный порядок между main.js и jquery.js будет undefined.