YII2. 在 js 中使用 URL

Los*_*Dok 1 javascript php yii2

我有以下 javascript 代码

$(".order-event-btn").click(function(e) {
$.ajax({
url: "URL",
type: "POST",
data: {
    eventId: $(e.target).attr('data-event-id'),
},
success: function(data) {
    //Some code
},
error: function(data) {
    //Some code
},
});
});
Run Code Online (Sandbox Code Playgroud)

我使用“BookAsset”包含此脚本。

这里

url: "URL",
Run Code Online (Sandbox Code Playgroud)

我需要控制器 Book 中操作“book-event”的 URL。

在服务器上,我可以这样做:

 Url::to('/book/book-event')
Run Code Online (Sandbox Code Playgroud)

但是如何在客户端获取 URL?

有一个解决方案:

1. js 文件通过 BookAsset 包含。

2.在视图文件中我注册包:

\frontend\assets\BookAsset::register($this);
Run Code Online (Sandbox Code Playgroud)

3.在视图文件中定义一个 bookEventURL 变量。现在它在 js 文件中可用。

$this->registerJs('var bookEventURL = ' . Url::to('/book/book-event') . ';');
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这个解决方案。 当我在许多视图中使用这个脚本时会发生什么。我必须在每个视图中定义一个变量 bookEventURL 吗?

我的问题。是否可以将 js 变量绑定到我的 BookAsset。当我在视图中注册我的 BookAsset 时,在页面源代码中自动插入下一个代码:

<script>var bookEventURL = "http://example.com/book-event/";</script>
Run Code Online (Sandbox Code Playgroud)

soj*_*oju 5

这样做的正确方法是在按钮标签中添加所需的信息,例如:

<?= Button::widget([
    'label' => 'Order',
    'options' => [
        'class' => 'order-event-btn',
        'data' => [
            'url' => Url::to(['book/book-event']),
        ],
    ],
]) ?>
Run Code Online (Sandbox Code Playgroud)

在你的 js 代码中:

$(".order-event-btn").click(function(e) {
    var url = $(this).data('url');
    // ...
});
Run Code Online (Sandbox Code Playgroud)

但是如果你真的想“绑定 js 变量”到你的BookAsset,你可以简单地覆盖register()

public static function register($view)
{
    parent::register($view);
    $view->registerJs('var bookEventURL = ' . json_encode(Url::to(['book/book-event'])) . ';');
}
Run Code Online (Sandbox Code Playgroud)