当ng-repeat上的复选框具有必需属性时,角度ng模型将更改为未定义

时间:2015-03-19 22:37:37

标签: javascript html arrays angularjs

我有一系列应用程序。该数组的一个子集被推入另一个数组。

$scope.applicant.selectedApps = [];
$scope.applicant.applications = applications;
angular.forEach(applications, function (application) {
    if(application.isSelected){
        $scope.applicant.selectedApps .push(application);
    }
}

我知道有2 ng重复循环遍历这些数组:

 <div class="row">
        <div class="form-group col-sm-10 col-sm-offset-1">
            <div class="radio">
                <label>
                    <input type="radio" name="intent" ng-model="applicant.intent" value="Y" required />YES
                </label>
            </div>
            <div class="row" ng-show="applicant.intent == 'Y'">
                <div class="col-xs-11 col-xs-offset-1">
                    <div class="row" ng-repeat="app in applicant.selectedApps">
                        <div class="col-sm-11 col-sm-offset-1">
                            <div class="checkbox">
                                <label>
                                    <input id="Prog{{app.appid}}" name="Progs" type="checkbox" ng-model="app.isSelected" ng-change="appChange(app)"  ng-required="applicant.intent == 'Y'" />
                                    {{app.Objective}} - {{app.Name}} - {{app.Description}}
                                </label>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

<div class="row">
        <div class="form-group col-sm-10 col-sm-offset-1">
            <div class="radio">
                <label>
                    <input type="radio" name="intent" ng-model="applicant.intent" value="N" required />NO
                </label>
            </div>
            <div class="row" ng-show="applicant.intent == 'N'">
                <div class="col-xs-11 col-xs-offset-1">
                    <div class="row" ng-repeat="dApp in applicant.applications">
                        <div class="col-sm-11 col-sm-offset-1">
                            <div class="checkbox">
                                <label>
                                    <input id="dProg{{dApp.appid}}" name="dProgs" type="checkbox" ng-model="dApp.isSelected" ng-change="dProgChange(dApp)" ng-required="applicant.intent == 'N' && appCount <= 0" />
                                    {{dApp.Objective}} - {{dApp.Name}} - {{dApp.Description}}
                                </label>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

两个更改功能如下:

$scope.dProgChange = function (app) {
    if (app.isSelected) {
        $scope.appCount++;
    } else {
        $scope.appCount--;
    }
};

$scope.ProgChange = function (app) {
    if (app.isSelected) {
        $scope.selectedAppCount++;
    } else {
        $scope.selectedAppCount--;
    }
};

我观察到的是,使用&#34;初始化的每个应用程序都被选中&#34;一旦单选按钮切换到&#34;否&#34;,将将false设置为undefined。当切换回&#34; YES&#34;被选中的开关回到假。

这会导致每次单选按钮值更改时都会触发dProgChange。

我无法弄清楚为什么选择&#34;被选中&#34;切换到undefined。

更新 在尝试创建简化示例时,我注意到只要需要复选框就会出现问题。 在下面列出的plunker中,只要未选中该复选框,复选框的模型值就会设置为undefined。在我看来,我遇到了同样的问题。

http://plnkr.co/edit/SBsdew8tzWdNgNOf6W1c?p=info

2 个答案:

答案 0 :(得分:15)

这是AngularJS(ng-modelNgModelController)的工作方式。

NgModelController有两个属性:$viewValue(用户输入的值)和$modelValue(绑定到模型的值)。当用户输入的值未通过验证时,NgModelController会将模型设置为未定义。

在AngularJS 1.3中,他们添加了ng-model-options指令。它允许您配置模型更新的方式/时间。您可以使用allowInvalid选项阻止将模型设置为undefined:

<input type="checkbox"
    ng-model="myModel.value"
    ng-model-options="{allowInvalid: true}">

答案 1 :(得分:1)

所以,我将添加此答案以供将来参考。这也适用于<input>。如果你有像

这样的东西
<input ng-model="speaker.vrange" ng-blur= "updateSpkV()" type="number" data-placement="right" min ="0" max="10"/>

如果将值设置为范围之外的值并且模型变量将设置为undefined,则输入将无效。当我直接输入超出界限的值而不是使用向上/向下箭头来调整值时,这成了我的问题。