angularjs动态改变模型绑定

时间:2014-04-18 03:00:22

标签: javascript angularjs

我有两种表格 - 结算和发货。如果用户选中了复选框,则应使用帐单邮寄地址填写送货地址并将其禁用。如果用户取消选中该框,则送货地址应为空白并返回启用状态。

我现在正在使用$ watch,但感觉很酷。我有2块手表嵌套在彼此看着相同的元素。我想知道是否有更好的方法来实现我的目标。

我尝试在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 = '';
        }
      });
    });
  }
});

1 个答案:

答案 0 :(得分:2)

我想我终于得到了你在此之后所拥有的一切。

选中此复选框后,它会在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