【问题标题】:AngularJS Checkbox not workingAngularJS复选框不起作用
【发布时间】:2014-09-19 23:22:57
【问题描述】:

我有一个名为 Case 的类,其中包含一个执行步骤列表。每个 executionStep 都有一个名为 enabled 的布尔属性。我试图在 HTML 端设置,但它永远不会在 JS 端更新。 HTML端

<td>
<input type="checkbox" 
  ng-checked="acase.executionSteps[0].enabled"
  ng-model="aa" ng-change="updateCaseExecutionStep('{{study.id}}','{{acase.id}}','{{acase.executionSteps[0].id}}','{{acase.executionSteps[0]}}')"/>
</td>`

在控制器端我有这个功能 更新案例执行步骤 定义如下图

$scope.updateCaseExecutionStep = function(studyId,caseId,executionStepId,executionStep){  
    ...
    ...
}

问题是当我更新我的复选框甚至手动更新执行步骤的启用属性时

$scope.updateCaseExecutionStep = function(studyId,caseId,executionStepId,executionStep){  
    executionStep.enabled = true;
    ...
}

我没有看到任何变化。 JS 中传入的 executionStep 的 enabled 属性没有变化。请帮忙。

我是否必须在 HTML 端进行某种修改?

【问题讨论】:

  • 你能提供一个小提琴或一个plunker
  • 我认为您不需要所有这些双括号,这样可以正常工作:ng-change="updateCaseExecutionStep(study.id,acase.id,acase.executionSteps[0].id,acase.executionSteps[0])"
  • 这似乎行得通,你如何将真/假值从 HTML 传递给 JS。有没有办法在函数调用中传递真值/值。例如在我的 updateCaseExecutionStep() 中,我如何传递是否已单击(true)或未单击(false)的状态

标签: angularjs checkbox


【解决方案1】:

您试图强制解决过于复杂的问题。首先,当您使用ng-model 时,您不需要ng-checkedng-change

假设您有以下控制器

app.controller('MainCtrl', function($scope) {
  $scope.case = { 
    caseId: 0,
    steps: [
      { id: 1, name: 'First step', enabled: true }, 
      { id: 2, name: 'Second step', enabled: false },
      { id: 2, name: 'Third step', enabled: false }]
    };
});

及相关的HTML

<div ng-repeat="step in case.steps">
  <input type="checkbox" ng-model="step.enabled">&nbsp;{{ step.name }}
</div>

仅此而已!

示例请点击此处http://plnkr.co/edit/QjD91l

编辑:

如果您需要根据选择进行一些处理,那么可以,您可以将ng-change 添加到input 控件。那么HTML就变成了

<input type="checkbox" ng-model="step.enabled" ng-change="stateChanged(step)">&nbsp;{{ step.name }}

在控制器中

$scope.stateChanged = function(step){
  console.log('Changed step id:' + step.id + ' enabled state to ' + step.enabled;   
};  

【讨论】:

  • 如何知道JS端点击了哪个Checkbox
  • 编辑了答案和 plunker。
  • 谢谢 Mikko,第一个答案本身就有效。我感谢您的帮助。你真好。
【解决方案2】:

我不得不为我的复选框放弃 ng-model,因为它没有获取模型中设置的初始值(响应服务调用)。所有其他输入控件都正确响应模型(有趣的是,根据支持复选框的值正确启用/禁用)。

相反,我使用了 'checked' 属性和 ng-click,如下所示:

<input type="text" ng-disabled="!myModel.isFruit" ng-model="myModel.seedCount">

<input type="checkbox" checked="{{myModel.isFruit}}" ng-click="onFruitClicked()"> Is Fruit

在我的控制器中:

$scope.myModel = {
    isFruit : myServices.getIsFruit(),
    seedCount : myServices.getSeedCount()
};

$scope.onFruitClicked = function() {
    // toggle the value
    $scope.myModel.isFruit = !$scope.myModel.isFruit;
    // save the new value
    myServices.setIsFruit($scope.myModel.isFruit);
};

【讨论】:

  • 我希望我能在两天前读到这篇文章!我跟你一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多