_.findwhere在选择选项上不适用于ng-repeat

时间:2018-09-05 13:51:59

标签: javascript angularjs

我有以下下拉代码

<select data-role="listview" class="form-control" id="txtUserRole" name="Role" data-ng-model="AddEditUserCtrl.SelectedRoleId" required="required"
        data-ng-disabled="!($root.UserSchoolPermissions.indexOf('User.ChangeRole') > -1) && AddEditUserCtrl.isInEditMode" 
        data-ng-change="AddEditUserCtrl.roleChanged(AddEditUserCtrl.SelectedRoleId)"  
        data-ng-class="{'border-error': AddEditUserCtrl.userForm.Role.$invalid && AddEditUserCtrl.userForm.Role.$error.required  && (!AddEditUserCtrl.userForm.Role.$pristine || submitted)}">
            <option value="" selected class="text-muted">{{'Role' | translate}}</option>
            <option data-ng-repeat="option in AddEditUserCtrl.roles" value="{{option.RoleId}}" title="{{option.RoleName}}" data-ng-selected="{{AddEditUserCtrl.SelectedRoleId == option.RoleId}}">{{option.RoleName | translate}}</option>
</select>

我想做的是从ng-model中获取AddEditUserCtrl.SelectedRoleId并将其传递给ng-change函数,以使用_.findwhere使用以下JS代码获取角色对象

 AddEditUserCtrl.roleChanged = function (roleId) {
            
            var selectedrole = _.findWhere(AddEditUserCtrl.roles, {
                RoleId: roleId
            });
            AddEditUserCtrl.user.Role = selectedrole
            }

调试后,我发现roleId是直接从html传递的,并且AddEditUserCtrl.roles数组包含与roleId匹配的对象,但是它不起作用。

检查以下屏幕截图以进行调试 enter image description here PS:我尝试使用data-ng-options来制作select标签,它可以工作,但我需要在option标签上使用data-neg-repeat

1 个答案:

答案 0 :(得分:1)

根据您的屏幕截图,您似乎正在尝试比较字符串和数字。 roleId传递给findWhere()似乎是一个字符串,但是您要匹配的属性RoleId是一个数字,这就是为什么没有匹配的原因。尝试以下操作,将Unary Plus Operator添加到来自HTML的字符串roleId中以转换为数字:

var selectedrole = _.findWhere(AddEditUserCtrl.roles, {
  RoleId: +roleId
});

您还可以使用Number(roleId)parseInt(roleId, 10)从字符串转换为数字。

var roles = [
  { RoleId: 1, RoleName: "Teacher" },
  { RoleId: 2, RoleName: "Student" },
  { RoleId: 9, RoleName: "Foo" }
];

function roleChanged(roleId) {
  var selectedRole = _.findWhere(roles, {
    RoleId: +roleId
  });
  
  console.log(selectedRole);
}

roleChanged("9");
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore.js"></script>

希望有帮助!