3

我为我的 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),它将 function() {...} 转换为字符串,因此在文档中写入以下内容

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

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

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

4

4 回答 4

3

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

CJavaScript::enocde(array(
   'prop'=>'value',
   'callback' => 'js:function(){}'
))
于 2013-06-08T18:17:06.257 回答
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() { ..... }
    }
));
于 2012-09-05T21:50:44.843 回答
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) . '}';
}
于 2012-09-05T20:30:47.027 回答
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

于 2013-08-22T17:21:10.983 回答