2016-09-23 66 views
1

嘿开发人员我建立一个应用程序窗体,用户在不同的领域输入数据。该应用程序的一部分是来自https://github.com/wbraganca/yii2-dynamicform的动态表单。现在在动态表单中,我有一个依赖下拉菜单,但是当我单击[+]时,依赖下拉菜单更改第一行上的数据,而不是第二行。动态窗体与依赖下拉

这里是我的代码。

在我的控制器

public function actionLists($name) 
    { 
     $countHs= Hs::find() 
         ->where(['hscode'=> $name]) 
         ->count(); 
     $Hs = Hs::find() 
       ->where(['hscode'=> $name]) 
       ->all(); 
     if($countHs > 0) 
     { 
      foreach ($Hs as $H) 
      { 
       echo "<option value='".$H->hsproduct."'> ".$H->hsproduct."</option>"; 


      } 
     }else{ 
       echo "<option> - </option>"; 
      } 


    } 

和我的形式

<div class="col-sm-6" style="width: 135px"> 
    <?= $form->field($modelsItems, "[{$i}]hscode")->dropDownList(
            ArrayHelper::map(Hs::find()->all(),'hscode','hsproduct'),      

             [ 


              'prompt'=>'', 

             'onchange'=> 

             '$.get("'.Url::toRoute('/hs/lists').'", { name: $(this).val() }) 
     .done(function(data) { $("#'.Html::getInputId($modelsItems, "[{$i}]hsproduct").'").html(data); });' 

              ])->label('HS.Code'); 


           ?> 

     </div> 
    <div class="col-sm-6" style="width: 135px"> 
    <?= $form->field($modelsItems, "[{$i}]hsproduct")->dropDownList(
            ArrayHelper::map(Hs::find()->all(),'hsproduct','hsproduct'), 
            [ 
            'prompt'=>'', 
            ])->label('HS.Product'); 
           ?> 
     </div> 

林更新了你的情况下,我的英语

+0

也许你可以显示它的样子的截图?也许这会更容易理解。不知道我是否可以回答这个问题。 –

+0

这是屏幕截图的链接。 http://imgur.com/a/nCISa – user5469526

+0

第一行如何工作?用你的JavaScript?实际上,我可以编写一个JavaScript函数/事件来帮助您获取特定字段的值。 –

回答

2

对不起新手。

我所做的是我在JS文件var i中声明的全局变量,并分配了0。第一个事件被解雇后,我将变量i加1。现在它在内存中包含1个。下一次它将需要1并再次加1。依此类推:

var i = 0; 

$(document).on('change', 'select', function(e) { 
    i++; 
}) 

请注意,只有在每行中选择一次而您不会回到特定行时才能使用。如果你想做这样的事情,你应该获取元素ID的编号,解析为浮动(而不是字符串)并将该编号用于事件脚本。

parseFloat($('#hs-0-hscode')[0].id.split('-')[1]) 

留下一个额外的解决方案(但不是根据你的)。以防万一。


使用Inspect source,找到你的输入域的命名方式(姓名或ID)。比方说,我们有name="hs-0-hscode"。这是刚刚然后你的jQuery:

$(document).on('change', 'select', function(e) { 
    if ($(this)[0].id.indexOf('hscode') > 0) { 
     // Now you can use Ajax to get a list of items you want to show. 
     // Element itself can be reached: $(this).parent().parent().parent().children().eq(1); 
     // For example: 
     // var data = $.parseJSON(results); 
     // $.each(data, function(key, value) { 
     // $('#client-company_size') 
     //  .append($("<option></option>") 
     //  .attr("value", key) 
     //  .text(value)); 
     // }); 
    } 
}); 
+0

抱歉的延迟,问题是hs-0-hsproduct每次增加一个。因此下一行的id将是hs-1-hsproduct,并且如果用户想要编辑hs-0-hsproduct它不允许它 – user5469526

+0

@ user5469526这是真的,这就是为什么我建议用'parseFloat'来使用那个。 –

+0

我有多个下拉菜单,但是当用户选择hs代码时,与它链接的信息将显示在下一个下拉菜单中。它建议使用下拉菜单或文本输入?只是一个问题。 – user5469526