【问题标题】:How to extend the User model for angular-meteor如何扩展 angular-metor 的用户模型
【发布时间】:2017-06-26 10:31:43
【问题描述】:

基于socially project,我尝试扩展用户添加字段:

export interface User extends Meteor.User {
  experience: number;
}

但是我得到以下错误:

client/imports/app/parties/party-details.component.ts (71, 7): Type 'Observable<User[]>' is not assignable to type 'Observable<User>'.
  Type 'User[]' is not assignable to type 'User'.
    Property 'experience' is missing in type 'User[]'.

据我了解,这是因为集合定义:

export const Users = MongoObservable.fromExisting(Meteor.users);

它使用Meteor.users(不带experience field)而不是我的自定义打字稿定义版本(带experience field)。

更新

相关文件:

我该如何解决这个问题?或者换句话说:如何扩展 angular-meteor 项目的用户模型?

更新 2

我想将问题改写为:如何扩展 Meteor 用户集合?

export const Users = MongoObservable.fromExisting(Meteor.users);

额外问题:我如何在创建新用户时使用0 启动该字段?

【问题讨论】:

  • 能否为第 71 行的 party-details.component.ts 添加代码以及如何声明 Observable,我认为问题出在:Type 'User[]' is not assignable to type 'User' 缺少体验错误可能只是一个第一个错误的后果
  • 我没有触摸party-details.component.ts 组件。我只是将体验添加到用户模型中。对我来说还没有意义。

标签: meteor angular-meteor


【解决方案1】:

但是我收到以下错误:

您必须将第 31 行更改为 users: Observable&lt;User[]&gt;; 而不是 users: Observable&lt;User&gt;; 虽然我什至不会在不更改的情况下抛出错误,所以我不知道错误应该在什么时候发生?

无论如何,Meteor Collection 查找总是返回一个对象数组,所以users: Observable&lt;User[]&gt;; 是正确的。

如何扩展 Meteor 用户集合?

关于如何扩展用户: 从技术上讲,您甚至不必为了存储额外的值而对其进行扩展,您在插入时为 Collection 提供的所有值都将为该文档存储。 扩展的意思是扩展要插入的用户文档的模型/模式。使用 TypeScript,这通常只是一个接口,但如果您不使用 TS,则会有诸如 https://github.com/aldeed/meteor-simple-schema 之类的替代方法,它实际上提供了设置默认值。我这样说只是为了帮助你理解这个概念。

一个接口虽然只做形状值,它不设置默认值或类似的东西。 AFAIK 这与 Java 中的接口相同。

所以你要做的就是像你说的那样扩展那个接口:

export interface User extends Meteor.User {
  experience: number;
} 

这应该是正确的。不能扩展“集合”,集合只是定义了 MongoDB 中的集合名称,可能还有谁可以访问它。

以及如何在创建新用户时以 0 开头字段

如前所述,您不能为接口设置默认值。您所能做的就是使用experience? : number 将值设置为可选,这会将其设置为未定义。 但是,您可以创建一个实现该接口的类,然后设置默认值。

export class SignupUser implements User{
    experience:number=0;
    email: string;
    password: string;
}

然后在第 29 行的 signup.component.ts 中,您可以这样做

 let signupUser=new SignupUser();
 signupUser.email= this.signupForm.value.email;
 signupUser.password= this.signupForm.value.password;
 Accounts.createUser(signupUser, err => [...])

甚至立即创建一个新的 SignupUser 并直接绑定到这些值。

或者你也可以这样做的简单方法

 Accounts.createUser({
    experience: 0,
    email: this.signupForm.value.email,
    password: this.signupForm.value.password
 }

希望对你有帮助。

【讨论】:

    【解决方案2】:

    看起来您的问题是您试图将用户数组Observable&lt;User[]&gt; 的可观察对象分配给用户Observable&lt;User&gt; 的可观察对象。您是否错误地将 Observable&lt;User[]&gt; 应用为 MongoObservable 的类型?

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 2016-10-12
      • 2011-02-28
      • 2013-12-06
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多