【问题标题】:angularjs dynamically change model bindingangularjs动态改变模型绑定
【发布时间】:2014-04-18 03:00:22
【问题描述】:

我有 2 份表格 - 账单和运费。如果用户选中一个复选框,则送货地址应填写帐单地址并禁用。如果用户取消选中该框,则送货地址应为空白并返回启用状态。

我现在可以使用 $watch 进行此操作,但感觉很笨拙。我有 2 个 $watches 嵌套在彼此观看相同的元素。我想知道是否有更好的方法来实现我正在做的事情。

我尝试在 ng-model 中使用三元运算符,如下所示,但这也不起作用。

<input ng-model="isSameAsBilling ? billName : shipName" ng-disabled="isSameAsBilling" />

A plunkr of my "working" code

HTML:

<input ng-model="billName" />

<input type="checkbox" ng-checked="isSameAsBilling" ng-click="sameAsBillingClicked()"/>

<input ng-model="shipName" ng-disabled="isSameAsBilling" />

JavaScript:

$scope.isSameAsBilling = false;

$scope.sameAsBillingClicked = function(){
  $scope.isSameAsBilling = !$scope.isSameAsBilling;
};

$scope.$watch('isSameAsBilling', function(isSame){

  if ($scope.isSameAsBilling) {

    var shipNameWatcher = $scope.$watch('billName', function (newShipName) {
      $scope.shipName = $scope.billName;

      var secondBillWatcher = $scope.$watch('isSameAsBilling', function(isChecked){
        if (!isChecked){
          shipNameWatcher();
          secondBillWatcher();
          $scope.shipName = '';
        }
      });
    });
  }
});

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    我想我终于在这里得到了你想要的东西。

    选中复选框时,它会在billName 上注册一个$watch,并将其镜像到shipName

    当复选框未选中时,注销 $watch 并清除 shipName

    angular
    
      .module('app', [])
    
      .controller('appController', ['$scope', function($scope){
    
        $scope.isSameAsBilling = false;
    
        $scope.isSameChanged = function() {
          if ($scope.isSameAsBilling) {
            // register the watcher when checked
            $scope.nameWatcher = $scope.$watch('billName', function(bName) {
              $scope.shipName = bName
            })
          } else {
            // deregister the watcher and clear the shipName when unchecked
            $scope.nameWatcher();
            $scope.shipName = ''
          }
        }
    
      }]);
    

    这里是PLUNK

    【讨论】:

    • 我试过了,但问题是你只能及时捕捉到那个值。如果您选中复选框,内容将被复制,但如果您在 billName 中输入内容,则不会反映到 shipName。
    • 啊,灯泡。好的,我知道问题到底是什么。让我想想
    • 好的,你可以用2个手表来做,但它们不需要嵌套。如果选中该框,则在 billName 上的一只手表会更新 shipName,在复选框值上的一只手表就像我以前一样。 Plunk
    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 2019-03-26
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多