ng-checked 不是第一次更新
ng-checked not updating first time
我正在使用 ng-repeat 生成复选框,可以选中或取消选中它们的初始状态,具体取决于该信息是否存在于数据中。我的问题是虽然它正确显示了它们的初始 checked/unchecked 状态,但是当我取消选中一个已经 'pre-checked' 的框时,该框实际上取消选中但模型没有改变。然后我再次检查它,模型没有改变但它是正确的。然后我再次取消选中,它在模型中正确清除并从那时起正常工作。几天来我一直在研究这个问题,但我完全被困住了!任何人都可以看到我是否在做一些愚蠢的事情吗?我的感觉是这是一个初始化问题,但我现在离它太近了,看不到。谢谢!
<!-- if this is a checkbox to be drawn -->
<div ng-if="option.option_type=='checkbox'">
<label class="item-checkbox-right">
{{option.caption}}
<!-- handle multiple options -->
<!-- if answered_options[n]weight exists, make option.ans = weight --></label>
<ul ng-repeat="opti in questionpart.survey_answer[0].answered_options">
<li style="list-style: none; display: inline">
<!-- if option is set in the received data, set it in the model -->
<div ng-if="opti.id == option.id">
<div ng-init="option.ans = option.weight"></div>
</div>
</li>
</ul>
<label class="item-checkbox-right">
<!-- show the checkbox and bind to option.ans-->
<input class="checkbox-light"
type="checkbox"
name="{{questionpart.id}}"
ng-false-value="0"
ng-true-value="{{option.weight}}"
ng-model="option.ans"
ng-checked="option.ans==option.weight" />
</label>
</div>
这是一个简单但不漂亮的example。对复选框使用默认的 Angular 指令对我来说从来都不太奏效。
app.js
$scope.data = [{checkboxValue: 0}, {checkboxValue: 1}, {checkboxValue: 2}];
$scope.dataCopy = angular.copy( $scope.data );
$scope.setCheckboxValue = function( checkbox, index ) {
checkbox.checkboxValue = checkbox.checkbox ? $scope.dataCopy[index].checkboxValue : 0;
}
$scope.parseCheckboxes = function() {
for( var i = 0, len = $scope.data.length ; i < len ; i++ ) {
$scope.data[i].checkbox = $scope.data[i].checkboxValue > 0 ? true : false;
}
}
$scope.parseCheckboxes();
基本上我在控制器上所做的就是自己处理复选框的逻辑。我创建了数组的副本,以便当我们从 false 切换到 true 时,我们得到初始值。
我在每个对象中添加了一个附加键,用于跟踪复选框的状态(真或假),因此它不会干扰实际值。
初始标记是通过解析对象数组并根据其值将所有复选框设置为真或假来完成的。
html
<body ng-controller="MainCtrl">
<label ng-repeat="d in data track by $index">
<input type="checkbox" ng-model="d.checkbox" ng-change="setCheckboxValue(d, $index )" />
{{d.checkbox}}
{{d.checkboxValue}}
<br>
</label>
</body>
html 部分不言自明。
可能有更好的方法来解决这个问题,但这是我想出的解决方案。不漂亮,但它有效。
我正在使用 ng-repeat 生成复选框,可以选中或取消选中它们的初始状态,具体取决于该信息是否存在于数据中。我的问题是虽然它正确显示了它们的初始 checked/unchecked 状态,但是当我取消选中一个已经 'pre-checked' 的框时,该框实际上取消选中但模型没有改变。然后我再次检查它,模型没有改变但它是正确的。然后我再次取消选中,它在模型中正确清除并从那时起正常工作。几天来我一直在研究这个问题,但我完全被困住了!任何人都可以看到我是否在做一些愚蠢的事情吗?我的感觉是这是一个初始化问题,但我现在离它太近了,看不到。谢谢!
<!-- if this is a checkbox to be drawn -->
<div ng-if="option.option_type=='checkbox'">
<label class="item-checkbox-right">
{{option.caption}}
<!-- handle multiple options -->
<!-- if answered_options[n]weight exists, make option.ans = weight --></label>
<ul ng-repeat="opti in questionpart.survey_answer[0].answered_options">
<li style="list-style: none; display: inline">
<!-- if option is set in the received data, set it in the model -->
<div ng-if="opti.id == option.id">
<div ng-init="option.ans = option.weight"></div>
</div>
</li>
</ul>
<label class="item-checkbox-right">
<!-- show the checkbox and bind to option.ans-->
<input class="checkbox-light"
type="checkbox"
name="{{questionpart.id}}"
ng-false-value="0"
ng-true-value="{{option.weight}}"
ng-model="option.ans"
ng-checked="option.ans==option.weight" />
</label>
</div>
这是一个简单但不漂亮的example。对复选框使用默认的 Angular 指令对我来说从来都不太奏效。
app.js
$scope.data = [{checkboxValue: 0}, {checkboxValue: 1}, {checkboxValue: 2}];
$scope.dataCopy = angular.copy( $scope.data );
$scope.setCheckboxValue = function( checkbox, index ) {
checkbox.checkboxValue = checkbox.checkbox ? $scope.dataCopy[index].checkboxValue : 0;
}
$scope.parseCheckboxes = function() {
for( var i = 0, len = $scope.data.length ; i < len ; i++ ) {
$scope.data[i].checkbox = $scope.data[i].checkboxValue > 0 ? true : false;
}
}
$scope.parseCheckboxes();
基本上我在控制器上所做的就是自己处理复选框的逻辑。我创建了数组的副本,以便当我们从 false 切换到 true 时,我们得到初始值。
我在每个对象中添加了一个附加键,用于跟踪复选框的状态(真或假),因此它不会干扰实际值。
初始标记是通过解析对象数组并根据其值将所有复选框设置为真或假来完成的。
html
<body ng-controller="MainCtrl">
<label ng-repeat="d in data track by $index">
<input type="checkbox" ng-model="d.checkbox" ng-change="setCheckboxValue(d, $index )" />
{{d.checkbox}}
{{d.checkboxValue}}
<br>
</label>
</body>
html 部分不言自明。
可能有更好的方法来解决这个问题,但这是我想出的解决方案。不漂亮,但它有效。