【问题标题】:typescript enum default value打字稿枚举默认值
【发布时间】:2017-07-28 01:44:04
【问题描述】:

我刚开始使用 Aurelia 框架学习 Typescript。我已经在 Aurelia 的 Todo 应用中实现了 Matthew Davis 的博客 TypeScript Enums in Aurelia Templates Using ViewEngineHooks http://davismj.me/blog/template-constants/

我想将默认枚举值设置为列表中的第二个值,并将默认值设置为列表中的第一个值。

另外我想知道 {Todo, Priority} 或只是 {Todo} 是否需要导入,如 todo-list.ts 中所示

tod​​o.ts

// Pro Tip: By starting our enum at 1, we ensure that all values in the enum are truthy.
export enum Priority {
    High = 1,
    Medium,
    Low
}

export class Todo {
    @observable done;
    //*** Setting priority: Priority = 2 OR priority: Priority = Priority.Medium - Does not change the default from High / 1 ***
    //constructor(public list: TodoList, public description: string, public priority: Priority = 2, public editing: boolean = false) { 
    constructor(public list: TodoList, public description: string, public priority: Priority = Priority.Medium, public editing: boolean = false) { 
        this.list = list;
        this.description = description;
        //*** Setting this.priority = 2 OR this.priority = Priority.Medium - Does not change the default from High / 1 ;
        //this.priority = 2;
        this.priority = Priority.Medium;
        this.editing = false;
    }

待办事项列表.ts

//*** Is {Todo} OR {Todo, Priority} needed for importing? ***
//import {Todo} from './todo';
import {Todo, Priority} from './todo';
...
  add(description) {
    if (description) {
      //*** Setting (this, description, 2) OR (this, description, Priority.Medium) - Does not change the default from High / 1 ***
      //this.todos.push(new Todo(this, description, 2));
      this.todos.push(new Todo(this, description, Priority.Medium));
      this.invalidateView();
    }
  }

tod​​o.html

<select id="priority" value.bind="type">
  <option value.bind="Priority[type]" repeat.for="type of Prioritys">${type}</option>
</select>

【问题讨论】:

  • 我的博客有错别字,感谢您帮我找到它

标签: typescript enums


【解决方案1】:

据我所知,在声明变量时,您无法设置枚举的默认值,就像数字或布尔值没有默认值一样。 但是,您可以为函数参数定义一个默认值,就像在构造函数 (priority: Priority = Priority.Medium) 中所做的那样,这样您就不必在调用构造函数时提供该参数。

两个附加说明: 不应该是this.priority = priority; this.editing = editing; 而不是this.priority = Priority.Medium; this.editing = false; 吗?其次,如果您将public 放在参数前面,则类属性会自动添加并分配,因此您不需要构造函数的附加行。但是对于更复杂的类,我可能会手动创建和分配属性。

关于您的第二个问题:您需要在引用该枚举时立即导入Priority,例如在编写Priority.Medium 时。当您比较 Priority 类型的两个不同属性而不使用枚举名称(例如 this.todos[0].priority === this.todos[1].priority)时,您不必导入它。

【讨论】:

    【解决方案2】:

    &lt;option&gt;s 上使用model.bind

    没有任何改变的原因是没有将正确的值“分配”给&lt;option&gt;。为此,您需要使用model 属性。

    <select id="priority" value.bind="type">
      <option model.bind="Priority[type]" repeat.for="type of Priorities">
        ${type}
      </option>
    </select>
    

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 2019-09-26
      • 2015-08-22
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多