【问题标题】:AngularJS: ng-model not binding to ng-checked for checkboxesAngularJS:ng-model 未绑定到 ng-checked 复选框
【发布时间】:2013-05-12 03:33:20
【问题描述】:

我在问这个问题之前提到了这个。

AngularJs doesn't bind ng-checked with ng-model

如果ng-checkedhtml 侧被评估为true,则ng-model 不会更新。我不能按照上述问题的建议ng-repeat,因为我必须为每个复选框使用一些样式。

这是我为说明我的问题而创建的 plunker。

http://plnkr.co/edit/YsOsPh3vjkPMUUDa6r2t

要查看我想要的内容,请打开控制台,然后单击Submit 按钮。请不要勾选任何复选框。

提前致谢!

【问题讨论】:

    标签: angularjs angularjs-ng-model angularjs-ng-checked


    【解决方案1】:

    我在处理从 1.2 到 1.3 的 Angular js 迁移时遇到了这个问题。 如果从控制器启动输入类型复选框,则不会触发输入类型复选框,并且也未触发 ng 更改事件。我尝试了所有类型,因为 ng model 和 ng checked 不起作用。 然后以对我有用的简单事情结束,例如通过替换为 ng click 来删除 ng change 事件。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    当您使用ng-model 时,您不需要ng-checked。如果您在 HTML 表单上执行 CRUD,只需在数据绑定期间为 CREATE 模式创建一个与您的 EDIT 模式一致的模型:

    创建模式:仅具有默认值的模型

    $scope.dataModel = {
       isItemSelected: true,
       isApproved: true,
       somethingElse: "Your default value"
    }
    

    编辑模式:来自数据库的模型

    $scope.dataModel = getFromDatabaseWithSameStructure()
    

    那么无论是EDIT 还是CREATE 模式,您都可以始终如一地使用您的ng-model 与您的数据库同步。

    【讨论】:

      【解决方案3】:

      ng-modelng-checked 指令不应一起使用

      来自文档:

      ngChecked

      如果ngChecked 中的表达式为真,则设置元素的选中属性。

      请注意,此指令不应与 ngModel 一起使用,因为这可能会导致意外行为。

      ——AngularJS ng-checked Directive API Reference


      改为从控制器设置所需的初始值:

      <input type="checkbox" name="test" ng-model="testModel['item1']" ̶n̶g̶-̶c̶h̶e̶c̶k̶e̶d̶=̶"̶t̶r̶u̶e̶"̶ />
          Testing<br />
      <input type="checkbox" name="test" ng-model="testModel['item2']" /> Testing 2<br />
      <input type="checkbox" name="test" ng-model="testModel['item3']" /> Testing 3<br />
      <input type="button" ng-click="submit()" value="Submit" />
      
      $scope.testModel = { item1: true };
      

      【讨论】:

        【解决方案4】:

        可以在 ng-init 中声明为真

        <!doctype html>
        <html ng-app="plunker" >
          <head>
            <meta charset="utf-8">
            <title>AngularJS Plunker</title>
            <script>document.write('<base href="' + document.location + '" />');</script>
            <link rel="stylesheet" href="style.css">
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.6/angular.js"></script>
            <script src="app.js"></script>
          </head>
          <body ng-controller="MainCtrl" ng-init="testModel['item1']= true">
            <label><input type="checkbox" name="test" ng-model="testModel['item1']"  /> Testing</label><br />
            <label><input type="checkbox" name="test" ng-model="testModel['item2']" /> Testing 2</label><br />
            <label><input type="checkbox" name="test" ng-model="testModel['item3']" /> Testing 3</label><br />
            <input type="button" ng-click="submit()" value="Submit" />
          </body>
        </html>
        

        而且你可以选择第一个和这里也显示的对象 true,false,flase

        【讨论】:

        【解决方案5】:

        您可以做的是使用ng-repeat 将您正在迭代的任何值传递给ng-checked,然后利用ng-class 根据结果应用您的样式。

        我最近做了类似的事情,它对我有用。

        【讨论】:

          【解决方案6】:

          你可以使用 ng-value-true 告诉 Angular 你的 ng-model 是一个字符串。

          如果我像这样添加额外的引号,我只能让 ng-true-value 工作(如官方 Angular 文档中所示 - https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D

          ng-true-value="'1'"
          

          【讨论】:

          • 谢谢,这就是我的解决方案!
          【解决方案7】:

          ngModelngChecked 不能一起使用。

          ngChecked 期待一个表达式,所以说ng-checked="true",你基本上是在说复选框将始终被默认选中。

          您应该能够只使用ngModel,绑定到模型上的布尔属性。如果你想要别的东西,那么你要么需要使用ngTrueValuengFalseValue(目前只支持字符串),要么编写自己的指令。

          您到底想做什么?如果您只想默认选中第一个复选框,您应该更改您的模型 -- item1: true,

          编辑:您不必提交表单来调试模型的当前状态,顺便说一句,您可以将{{testModel}} 转储到您的 HTML(或&lt;pre&gt;{{testModel|json}}&lt;/pre&gt;)中。您的ngModel 属性也可以简化为ng-model="testModel.item1"

          http://plnkr.co/edit/HtdOok8aieBjT5GFZOb3?p=preview

          【讨论】:

          • ng-checked 由表达式计算为真。为了表明ng-model 没有链接,我在那里使用了true。在启动控制器时,我希望取消选中所有复选框。在一些 ajax 请求之后,我计算 ng-checked 以选中复选框。这是我的ng-model 没有更新的时候。
          • @Abilash 你不应该使用ngChecked。你的模型很好,你只需要在你的ajax回调中设置testModel.item1 = true,然后调用$scope.$apply()来更新你的视图。
          • 我们只是错误地使用了ng-checked 而不是ng-model...再也不会了!
          • 根据docs.angularjs.org/api/ng/directive/ngChecked 上的注释“请注意,this(ngChecked) 指令不应与 ngModel 一起使用,因为这会导致意外行为。”
          • @Langdon 我在这个问题上被困了大约几个小时。你的提示 $scope.$apply() 解决了我的问题。非常感谢。
          猜你喜欢
          • 2019-02-09
          • 1970-01-01
          • 1970-01-01
          • 2014-07-12
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多