如何将文字 JavaScript 代码传递给 Yii 框架方法


How to pass literal JavaScript code to Yii framework methods?

我正在使用相应的CHtml方法生成一个复选框,我想在AJAX请求之前和之后运行一些JavaScript代码。这是代码:

echo CHtml::checkBox('markComplete', FALSE, 
    array(
        'class' => 'markComplete',
        'ajax'  => array(
            'type'       => 'POST',
            'url'        => $this->createUrl('/events/events/MarkComplete'),
            'data'       => 'event_status='.$events['id'],
            'beforeSend' => 'function(){ $(this).parent("TR").hide(); }',
            'success'    => 'function(resp) { $("#right").append(resp); }'
        ),
    )
); 

我怎么能告诉 Yii beforeSendsuccess是 JavaScript 代码而不是纯字符串?

从 Yii 1.1.11 开始提供更好的选择

所有框架类现在都支持通过CJavaScriptExpression自定义 JavaScript 代码段。像这样使用它:

'ajax' => array(
    'beforeSend' => new CJavaScriptExpression(
        'function(){ $(this).parent("TR").hide(); }'
    ),
    // ...
)

默认情况下,以 js: 为字符串添加前缀的选项仍然可用,但现在可以使用 CJavaScript::encode 上的可选参数根据需要禁用它。

原答案

如果你想在选项中包含文字 JavaScript 代码,Yii 中的约定是在代码前面加上 js: 。所以你会这样写:

'ajax' => array(
    'type'=>'POST',
    'url'=>$this->createUrl('/events/events/MarkComplete'),
    'data'=>'event_status='.$events['id'],
    'beforeSend' => 'js:function(){            
        $(this).parent("TR").hide();
    }',
    'success'=>'js:function(resp) {
        $("#right").append(resp);
    }'
    ),
)

不幸的是,这没有很好的记录,这就是为什么人们不时会遇到这个问题的原因。