我为我的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实际上在文档中写入了带引号的函数?
答案 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