2011-09-02 65 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' 
});