【问题标题】:AngularJS - Trigger ng-change based on ng-model valueAngularJS - 根据 ng-model 值触发 ng-change
【发布时间】:2016-12-09 23:22:36
【问题描述】:

所以我遇到了一个问题,我花了一些时间研究但无济于事,还没有找到可行的解决方案。

我的情况:

  • 我有一排复选框可以触发带有 ng-change 的函数(用户单击复选框)。
  • 如果复选框被选中,每个复选框都绑定到一个 ng-model 布尔值。
  • 对于每一行,我都有一个“全选”复选框,它会触发一个函数,该函数循环遍历该行中的复选框,并根据全选值将其 ng-model 的布尔值更新为真或假。
  • 在 DOM 上,全选工作正常,并且每个复选框的布尔值都发生了变化,从而导致复选框被选中或取消选中。
  • 即使复选框上的 ng-model bool 从 true 更改为 false,也不会触发 ng-change 函数。

我尝试在 ng-models 上实现 watchers 以尝试触发每个 ng-change,但它不起作用。

我尝试将 ng-change 更改为 ng-click 并强制将全选功能更改为 .trigger('click'),这种方法可行,但如果其中一个复选框是 hacky 并且无法正常工作已经点击了。这会导致它的真实值相反。

如果用户不直接单击复选框,是否有办法从控制器触发复选框上的 ng-change 功能?我正在通过函数传递参数,因此它必须从 ng-change 中触发,而不仅仅是在控制器中。

Here 是一个指向我想要完成的 JS Bin 的链接。

如果您单击顶部框(全选),则填充所有下部框。如果您单击其中一个下部框,它会触发 ng-change 函数,该函数会在触发的 DOM 上显示一些文本。如果单击全选按钮,它不会显示文本(不触发 ng-change)。

【问题讨论】:

  • 给我们看一些代码。
  • 解释很酷,但真的不能告诉我们你是否犯了一个小错误。请显示一些代码以及解释。
  • 更新了 js bin 链接

标签: javascript angularjs checkbox angularjs-ng-change


【解决方案1】:

据我了解,您想要的是在单击“全选”复选框时触发每个子复选框。

我认为您可以简单地尝试在 $scope.selectAll 函数中调用 $scope.checked,如下所示:

function MyCtrl($scope) {
$scope.tableRows = [{"oral": false, "cleaning": false, "filling": false, "xray": false,"crown": false, "canal": false, "dentures": false, "braces": false, "visible": false, "subtotal": 0},{"oral": false, "cleaning": false, "filling": false, "xray": false,"crown": false, "canal": false, "dentures": false, "braces": false, "visible": false, "subtotal": 0},{"oral": false, "cleaning": false, "filling": false, "xray": false,"crown": false, "canal": false, "dentures": false, "braces": false, "visible": false, "subtotal": 0},{"oral": false, "cleaning": false, "filling": false, "xray": false,"crown": false, "canal": false, "dentures": false, "braces": false, "visible": false, "subtotal": 0}];
$scope.prices = {oral: 100, cleaning: 50, filling: 75, xray: 200, crown: 125, canal: 100, dentures: 60, braces: 130}
$scope.selectAll = function(procedure, checked) {
    angular.forEach($scope.tableRows, function(person, index) {
      $scope.checked($scope.prices[procedure], index, checked, procedure);          
    });
};
$scope.checked = function(amount, position, checked, procedure) {
   $scope.tableRows[position][procedure] = checked;
   if (checked) {
      $scope.fired = 'FIRED!';
      $scope.dollarAmmount = $scope.dollarAmmount + amount;
      $scope.tableRows[position].subtotal += amount;
   } else if (!checked) {
      $scope.fired = '';
      $scope.dollarAmmount = $scope.dollarAmmount - amount;
      $scope.tableRows[position].subtotal -= amount;
   }
 }
}

在JS Bin上运行

我还优化了一些代码行。希望它能解决您的问题。

干杯!

【讨论】:

  • 好主意,我想我只是工作太久,代码被阻塞,想不出这个简单的解决方案。谢谢!
【解决方案2】:

尝试如下更改selectall方法,希望对您有所帮助。

$scope.selectAll = function(procedure, checked) {

  if (checked) {
  angular.forEach($scope.tableRows, function (person) {

    person[procedure] = true;
  })
} else if (!checked) {
  angular.forEach($scope.tableRows, function (person) {
    person[procedure] = false;
  })
}
};

在这里找到工作JS BIN

【讨论】:

    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多