2011-09-02 66 views
0

我需要一些Yii帮助。从onChange事件调用控制器动作

如何从文本框onChange事件调用Controller动作?

更新: 我有一个用CActiveForm构建的窗体。这个表格有许多文本框。当我更改任何值时,必须使用新输入的值计算公式。所以,我试图做的是以下几点:

<tr> 
     <td>Average KW Demand:</td> 
     <td><?php echo $form->textField($lfac_model, 'kw_demand', array('size'=>5));?></td> 
    </tr> 
    <tr> 
     <td>Estimated Load Factor:</td> 
     <td><?php echo $form->textField($lfac_model, 'loadf', array('size'=> 5));?>/td> 
    </tr> 

当用户改变“预测负荷率”,“平均kW需求”值应与公式的结果进行更新。我想到的是将公式存储在表中,然后转到Controller操作,检索特定公式,计算新值并将其发送回视图。我不确定这是否是实现此目标的最佳主意。

回答

1

你应该可以使用CJuiAutoComplete Yii小部件来做你想做的。有一个基本演示here,在Yii文档中还有其他例子。在你的情况下,你需要确保的主要事情是你还指定了“appendTo”选项,请参阅该小部件使用的jQuery autocomplete docs。因此,基本上,您将为“预计负载因数”字段设置小部件,并通过appendTo属性指向“平均千瓦需求”字段。

如果你不想自动完成的东西,只是想以取代的价值,你可以使用htmlOptions属性“AJAX”您“loadf”的价值,像这样:

'ajax' => array(
    'type'=>'POST', //request type 
    'url'=>$this->createUrl('site/ajaxAction'), //url to call 
    'success'=>'function(data) { $(\'#kw_demand\').val(data) }',// function to call onsuccess 
      // "data" is returned data and function can be regular js or jQuery 
) 

见:CHtml#ajax-detailjQuery.ajax。在这种情况下,你最有可能返回纯文本,以便您的控制器功能看起来像:

public function actionAjaxAction() { 
    [your data functions...] 
    echo $kw_demand_string; 
    Yii::app()->end() 
} 
+0

它解决了!谢谢。正是你所说的。谢了哥们! – ivantxo

1

一个TextBox的onChange事件是一个JavaScript事件。它生活在你的应用程序的不同方面。

要在您的控制器上调用一个动作,您将不得不使用一些AJAX(或异步调用)。这里的想法是基本上将一些数据发布到处理该操作的路由。

例如:

  • 说你有这条路线/页:/product/details =>ProductController::actionDetails()
  • 你想拥有与自动完成选项的搜索字段更新。
  • 您在搜索字段的onChange事件中设置了javascript,以调用将字段值(当前输入的文本)发布到控制器上的操作的方法。
  • 你设置这条线路/页/product/ajaxautocomplete =>ProductController:actionAjaxAutocomplete()
  • 本次行动发生在从你的JavaScript异步HTTP请求(AJAX调用)的公布值和返回的基于数据库的可能结果的列表。
  • 然后,您的JavaScript接受返回(通常以XML/JSON,有时为HTML),并将这些值应用于客户端的dom。

您可以使用jQuery来轻松实现这一点:

$.ajax({ 
    type: 'POST', 
    url: '/product/ajaxautocomplete', 
    data: { 'searchPhrase' => searchBox.value }, 
    success: function(data, textStatus, jqXHR) { applyValues(data); }, 
    dataType: 'json' 
});