CJSON ::编码一个javascript函数

时间:2012-09-05 17:28:20

标签: yii json

我为我的js小部件使用jQuery小部件工厂(jQuery小部件)。

$.widget('cool.someWidget', {
     options: {
         onSomething: null
     }
     // other js code
});

通常从你编写的js运行小部件

$(selector).someWidget({
    onSomething: function() { ..... }
});

在Yii中,我使用CJSON :: encode来编译包含onSomething事件的所有初始化属性。

echo CJSON::encode(array(
    'onSomething' => 'function() {....}',
));

但是由于转换(CJSON),它将函数(){...}转换为字符串,因此在文档中写入以下内容

$(selector).someWidget({
    onSomething: "function() { .... }"
});

因为当我调用this._trigger('onSomething')时,onSomething实际上是一个字符串,它不会运行代码。

这个问题我只有在“生成”视图而不是Ajax请求时(我在系统中处理不同)。是否有一些“正常”的方式使Yii实际上在文档中写入了带引号的函数?

4 个答案:

答案 0 :(得分:3)

实际上有一种构建方法可以阻止编码函数用引号包装函数声明,你应该在函数声明之前添加 js:

CJavaScript::enocde(array(
   'prop'=>'value',
   'callback' => 'js:function(){}'
))

答案 1 :(得分:1)

恕我直言,问题的前提是有缺陷的,如果你完全支持这个问题会更好。

这是什么问题?您无法将JavaScript代码作为PHP字符串提供。

你为什么要这样做?我不相信存在令人信服的理由。 JavaScript代码应该写成JavaScript代码;把它写成一个字符串就更糟了。

很可能你想把一堆可用的选项作为PHP变量传递给插件,并且兴奋地传递所有选项似乎是一个好主意(包括那些这是函数)以相同的方式。

但还有另一种方式,$.extend提供:对所有标量(字符串,数字)使用CJSON::encode,然后切换回纯JavaScript用于回调。

$(selector).someWidget($.extend(
    <?php echo CJSON::encode(array(/* no functions here, just scalars */));?>,
    { // and now, back in JavaScript-land, code follows:
        onSomething: function() { ..... }
    }
));

答案 2 :(得分:0)

我编写了以下函数,它完全符合我的要求。如果有一些原生的Yii解决方案,我真的很想知道它。

public function encodeOpts($data, $jsCode = null) {
    $rVal = CJSON::encode($data);

    if ($jsCode == null)
        return $rVal;

    foreach($jsCode as $key => $code) {
        $codeEntries[] = "\"{$key}\": {$code}";
    }

    return substr_replace($rVal, ', ' . implode(', ', $codeEntries), -1) . '}';
}

答案 3 :(得分:0)

我这样解决了:

if ($this->user_options !== null && is_array($this->user_options))
{
    $reqs = CJavaScript::encode(
        array_merge(
            $this->user_options,
            array(
                // adding a default callback to options 
                'onLoad' => 'js: function() {$("#info").text("Hi")}'
                )
            )
        );
}

注意:js:仅适用于CJavaScript,不适用于CJSON

相关问题