如何将 Mongoose 模型与 angularjs 复选框绑定

Posted

技术标签:

【中文标题】如何将 Mongoose 模型与 angularjs 复选框绑定【英文标题】:How to bind Mongoose model with angularjs Checkbox 【发布时间】:2016-08-10 21:59:14 【问题描述】:

我正在尝试修改meanjs提供的示例应用程序 示例应用程序有一个 angularsjs 视图,如下所示

  <input class="form-control" type="text" name="roles" 
  ng-model="vm.user.roles" id="roles" ng-list required />

mongoose 模型中更新角色的部分如下。

/**
 * Module dependencies
 */
var mongoose = require('mongoose'),
  Schema = mongoose.Schema,
  crypto = require('crypto'),
  validator = require('validator'),
  generatePassword = require('generate-password'),
  owasp = require('owasp-password-strength-test'),
  path = require('path'),
  logger = require(path.resolve('./config/lib/logger'));
/**
 * A Validation function for local strategy properties
 */
var validateLocalStrategyProperty = function (property) 
  return ((this.provider !== 'local' && !this.updated) || property.length);
;

/**
 * A Validation function for local strategy email
 */
var validateLocalStrategyEmail = function (email) 
  return ((this.provider !== 'local' && !this.updated) || validator.isEmail(email,  require_tld: false ));
;

var validateRoles = function (roles) 
  console.log("validate");
  return true;
;
/**
 * User Schema
 */
var UserSchema = new Schema(
  firstName: 
    type: String,
    trim: true,
    default: '',
    validate: [validateLocalStrategyProperty, 'Please fill in your first name']
  ,
  lastName: 
    type: String,
    trim: true,
    default: '',
    validate: [validateLocalStrategyProperty, 'Please fill in your last name']
  ,
  displayName: 
    type: String,
    trim: true
  ,
  email: 
    type: String,
    unique: true,
    lowercase: true,
    trim: true,
    default: '',
    validate: [validateLocalStrategyEmail, 'Please fill a valid email address']
  ,
  username: 
    type: String,
    unique: 'Username already exists',
    required: 'Please fill in a username',
    lowercase: true,
    trim: true
  ,
  password: 
    type: String,
    default: ''
  ,
  salt: 
    type: String
  ,
  profileImageURL: 
    type: String,
    default: 'modules/users/client/img/profile/default.png'
  ,
  provider: 
    type: String,
    required: 'Provider is required'
  ,
  providerData: ,
  additionalProvidersData: ,
  roles: 
    type: [
      type: String,
      enum: ['USR', 'ADM', 'SAD']
    ],
    default: ['USR'],
    required: 'Please provide at least one role',
    validate: [validateRoles, 'Please provide at least one role']
  ,
  updated: 
    type: Date
  ,
  created: 
    type: Date,
    default: Date.now
  ,
  /* For reset password */
  resetPasswordToken: 
    type: String
  ,
  resetPasswordExpires: 
    type: Date
  
);

现在我正在尝试将上述文本输入转换为 checkbox 。我修改后的观点如下

  <label ng-repeat="rolename in vm.rolesnames">
  <input type="checkbox" text=rolename 
  ng- checked="vm.chooserole(rolename)" ng-model="vm.user.roles">
  rolename
  </label>

我的 Angularjs 控制器更新角色如下

vm.rolesnames = ['USR', 'ADM', 'SAD']; //dummy for view
vm.userused = new Set(user.roles);// this is from model

function chooserole(rolename) 
  console.log("chooserole");
  if (rolename === 'USR') 
    return vm.userused.has('USR');
   else if (rolename === 'ADM') 
    return vm.userused.has('ADM');
   else if (rolename === 'SAD') 
    return vm.userused.has('SAD');
  
  return false;

每当加载页面时,都会正确分配用户的角色,但每当我单击复选框时,所有三个复选框都会被选中。 如何将复选框绑定到枚举并将其发送到模型?

【问题讨论】:

【参考方案1】:

你的模型是什么样的?我建议使用 ui-select https://github.com/angular-ui/ui-select 而不是多个复选框,因为它更简洁的用户体验和更少的控制器代码需要维护。然后,您可以创建一个角色枚举,并且可以对其进行管理,并且您的所有代码将继续使用该角色枚举。更容易管理。

angular.module('globals', [])
  .constant('Roles', ['USR', 'ADM', 'SAD']);

这是我在用户模型中的属性:

  roles: 
    type: Array,
    default: ['USR']
  

在我的控制器范围内,角色或使用依赖注入来加载全局枚举/角色,如上所述:

$scope.rolesNames = ['USR', 'ADM', 'SAD];

对于前端/Angular,我使用 UI 选择

  user
  <br/>  
           <ui-select multiple ng-model="user.roles" theme="select2" ng-disabled="disabled" style="width: 300px;">
            <ui-select-match placeholder="Select roles..."> $item </ui-select-match>
            <ui-select-choices repeat="role in rolesNames">
               role 
            </ui-select-choices>
          </ui-select>

【讨论】:

感谢您的回答。我已经更新了整个模型。我将尝试使用 ui-select 模块来替换复选框。 我试着做你想要使用的复选框方法,它很乱。可以修复您的方法,但是同步复选框然后更新用户对象需要做很多额外的工作,所以我不建议这样做。 @Rengas 效果如何?如果对您有用,请将我的答案标记为正确。谢谢 我认为问题是因为清单总是与一个模型相关联。因为我对meanjs很陌生。在尝试用您的答案更改应用程序中的内容的过程中,我迷路了。在某一时刻,我什至不确定自己在做什么。所以现在我通过使用checklist-model 解决了它。谢谢你的回答。

以上是关于如何将 Mongoose 模型与 angularjs 复选框绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何在不创建 Mongoose 模型的情况下将 GraphQL 与 Mongoose 和 MongoDB 一起使用

如何将 Mongoose 对象与 JSON 对象进行比较?

如何使用 Mongoose 在 AngularJS 中创建 PUT 函数

如何在 Mongoose 中更新/更新文档/数据? Passport MongoDB、Express、AngularJS、Nodejs

如何将 Mongoose 与 GraphQL 和 DataLoader 一起使用?

AngularJS SPA 使用 API 和 Mongoose