【问题标题】:How to set array value as javascript function closure in php?如何在 php 中将数组值设置为 javascript 函数闭包?
【发布时间】:2017-08-05 06:19:26
【问题描述】:

我正在尝试在我的 php 项目中为可动手做的插件实现我自己的渲染器。 所以插件的参数集准备为php数组:

$options = [
    'data' => $orders,
    'columns' => [
        [
            'data' => 'email',
            'renderer' =>

// Heredoc goes here
<<<JAVASCRIPT
function(value) {
    console.log(value);
}
JAVASCRIPT

        ],
        ...
    ]
];

然后将其作为参数传递给插件:

$this->registerJs('hot = new Handsontable("mydiv", ' . json_encode($options) . ')');

因此,当呈现 html 时,我会看到:

hot = new Handsontable("mydiv", {
    'data': ...,
    'columns': [
        {
            'data': 'email',
            // Here is the problem!
            'renderer': 'function(value) { \n\r console.log(value) \n\r }'
        },
        ...
    ]
});

问题是我不能将此函数作为闭包传递,只能作为引号中的文本传递。

有可能吗?

【问题讨论】:

  • here-doc 始终是一个字符串。没有办法在 JSON 中编码函数。
  • @Barmar 我应该在之前定义函数并将其名称作为参数传递吗?
  • 类似的东西,但是使用json_encode() 没有简单的方法来获得它。你能在registerJs()里放多条语句吗?
  • @Barmar 实际上传递了一些标志: JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK
  • @Barmar registerJs 是 Yii2 查看函数

标签: javascript php yii2 heredoc


【解决方案1】:

您不能在 JSON 中对函数进行编码。要做的是将对象分配给一个变量,以便您可以将函数作为单独的步骤添加到 Javascript 中。

$options = [
    'data' => $orders,
    'columns' => [
        [
            'data' => 'email'
        ],
        ...
    ]
];

$jsFunc = <<<JAVASCRIPT
function(value) {
    console.log(value);
}
JAVASCRIPT;

$this->registerJs('var options = ' . json_encode($options) '; options.columns[0].renderer = ' . $jsFunc . '; hot = new Handsontable("mydiv", options);');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2017-10-26
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多