AngularJS:ng-model不绑定到ng-checked的复选框

时间:2013-05-17 03:38:54

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

在提出这个问题之前我曾提到这一点。

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

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

以下是我创建的用于说明问题的插件。

http://plnkr.co/edit/YsOsPh3vjkPMUUDa6r2t

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

提前致谢!

6 个答案:

答案 0 :(得分:120)

ngModelngChecked并不意味着一起使用。

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

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

你正在尝试做什么?如果您只想在默认情况下选中第一个复选框,则应更改模型 - item1: true,

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

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

答案 1 :(得分:11)

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

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

ng-true-value="'1'"

答案 2 :(得分:1)

你可以做的是使用ng-repeat传递你正在迭代的ng-checked的值,并从那里利用ng-class来应用你的风格取决于结果。

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

答案 3 :(得分:1)

可以声明为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

答案 4 :(得分:0)

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 };

答案 5 :(得分:0)

使用const [isConnected, setIsConnected] = useState(false); useEffect(() => { console.log("useEffect welcome"); const unsub = NetInfo.addEventListener(state => { setIsConnected(state.isConnected); }); return () => unsub(); }, []); const getPoints = async () => { console.log("getPoints welcome"); let points = await AsyncStorage.getItem("savedPoints"); if (!!points) { const getEmail = async () => { const userData = await AsyncStorage.getItem("userData"); if (userData) { // parse converts a string to an object or array const transformedData = JSON.parse(userData); const { userEmail } = transformedData; return userEmail; } }; const email = await getEmail(); // Give it some time to get the token and userId, // because saveData needs them. setTimeout( async () => await dispatch(dataActions.saveData(email, +points)), 3000 ); await AsyncStorage.removeItem("savedPoints"); } }; if (isConnected) getPoints(); 时不需要ng-checked。如果您要在HTML表单上执行 CRUD ,只需在数据绑定期间为ng-model模式创建与您的CREATE模式一致的模型即可:

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

EDIT

编辑模式:数据库中的模型

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

然后,无论是$scope.dataModel = getFromDatabaseWithSameStructure() 还是EDIT模式,您都可以始终使用CREATE与数据库同步。