有条件地将第一个输入值反映到第二个输入字段(基于复选框)

Posted

技术标签:

【中文标题】有条件地将第一个输入值反映到第二个输入字段(基于复选框)【英文标题】:reflect first input value to second input field conditionally (based on checkbox) 【发布时间】:2016-08-09 18:54:18 【问题描述】:

第一个输入字段

<input type="text" id="prmnt_a1" ng-model="prmnt_a1" class="customInput" placeholder="Address Line 1"/>

复选框

<input type="checkbox" id="same" ng-model="same" ng-change="stateChanged(same)"/>

第二个输入

 <input type="text" id="prmnt_a2" ng-model="prmnt_a2" class="customInput" placeholder="Address Line 2"/>

如果复选框为真,则第一个输入值应反映到第二个输入字段。

【问题讨论】:

【参考方案1】:

试试这个角码

$scope.stateChanged = function(same)
    if(same == true)
        $scope.prmnt_a2 = $scope.prmnt_a1;
    else 
        $scope.prmnt_a2 = '';
    

【讨论】:

我已经尝试过了,但我必须再次设置所有字段。但想要一个最短的方法,比如 ng-attr-value=prmnt_a1【参考方案2】:

如果您想纯粹从视图中执行此操作,则可以使用ng-change

<input type="text" id="prmnt_a1" ng-model="prmnt_a1" class="customInput" placeholder="Address Line 1"/>

<input type="checkbox" id="same" ng-model="same" ng-change="stateChanged(same); same ? prmnt_a2 = prmnt_a1 : false"/>

<input type="text" id="prmnt_a2" ng-model="prmnt_a2" class="customInput" placeholder="Address Line 2"/>

请注意,这只会设置第二个输入的值一次(选中复选框时),如果用户返回第一个输入并再次更改它,第二个输入将不会更新,如果您想要第二个在这种情况下也需要更新输入,那么您也必须将ng-change 添加到第一个输入:

<input ng-change="same ? prmnt_a2 = prmnt_a1 : false" type="text" id="prmnt_a1" ng-model="prmnt_a1" class="customInput" placeholder="Address Line 1"/>

【讨论】:

我会尝试,但如果我想在同一个元素上运行另一个方法,那么函数执行的顺序是什么。 @sumitchoudhary 不明白你的意思。你的意思是如果你也想在ng-change 中运行另一个方法吗?如果是这种情况,那么只要用; 将它们分开,就可以运行多个方法/函数。就像我在这里做的那样:ng-change="stateChanged(same); same ? prmnt_a2 = prmnt_a1 : false"【参考方案3】:

试试这个:为复选框注册一个更改事件处理程序并设置/使用输入值

$(function()
  $('#same').change(function()
    //set input value for checkbox true
    if($(this).is(':checked'))
   
     $('#prmnt_a2').val($('#prmnt_a1').val());
   
   else
   
    //clear input box value
    $('#prmnt_a2').val('');
   
  );
);

【讨论】:

我同意你的方法,但我不想写太多代码。我认为在 Angular 中有一种更好的方法来做到这一点。【参考方案4】:

我不确定,但这里有一些你可以尝试的东西:

ng-change="prmnt_a2 = (same)?prmnt_a1:''"

这是一个棘手但完整的 html 方式,应该可以工作:

<div ng-if="same==false">
    <input type="text" id="prmnt_a2" ng-model="prmnt_a2" class="customInput"      placeholder="Address Line 2"/>
</div>
<div ng-if="same==true">
    <input type="text" id="prmnt_a2" ng-init="prmnt_a2=prmnt_a1" disabled ng-model="prmnt_a2" class="customInput" placeholder="Address Line 2"/>
</div>

注意 : ng-init 通常不是这样使用的,请务必使用 ng-if 而不是 ng-show/hide。

否则,如果这不起作用:控制器中的自定义指令或函数/$watch。 ng-attr 在这里不起作用。

编辑:对于自定义指令,这看起来像代码:

.directive('myDirective', function()
   return
      restrict : 'A',
      scope:
         same:'=myBoolean'
         value:'=myValue'
      ,
      require:'ngModel',
      link:function(scope, element, attr, ngModelCtrl)
          scope.$watch('same', function(newValue)
             if(newValue)
                ngModel.setViewValue(scope.value);          
             
          );
      
   


<input type="text" id="prmnt_a2" ng-init="prmnt_a2=prmnt_a1" ng-disabled="same" ng-model="prmnt_a2" my-directive my-boolean="same" my-value="prmnt_a1" class="customInput" placeholder="Address Line 2"/>

这个指令是相当基本的。如果您需要更复杂的东西,请查看网上的文档。

【讨论】:

但是在这种方法中,我必须为每个元素编写额外的代码 我刚刚添加了一个使用自定义指令的示例,请检查一下。

以上是关于有条件地将第一个输入值反映到第二个输入字段(基于复选框)的主要内容,如果未能解决你的问题,请参考以下文章

iText onchange事件未触发

将第二个表中的第二个(条件)结果添加到 SQL 查询

第二十二节,三元运算

将第二个活动的价值保存到第一个活动,而不会丢失更新的数据

正确地将第二个动态模板添加到 Gatsby/NetlifyCMS - 我哪里出错了?

导航控制器和记忆值