使用defineProperty创建计算的observable时,避免使用属性的魔术字符串

时间:2014-07-18 22:52:32

标签: typescript durandal

享受我的公共属性现在默认可观察的事实。我从文档中看到你使用

创建了一个计算器
observable.defineProperty(viewModel, 'fullName', function(){
  return this.firstName + ' ' + this.lastName;
});

要在打字稿中这样做(如果Rob有更好的方法,请纠正我),我去:

import obs = require('plugins/observable'); 

class Upload {

public enableUpload: boolean = false;


constructor() {
    obs.defineProperty(this, 'enableUpload', {
        read: () => {
            var result = this.fileExists && this.createAs;
            return result;
        }
    });
}

我唯一不喜欢的是该属性作为字符串传递给defineProperty函数。任何方式?

干杯

杰里米

2 个答案:

答案 0 :(得分:1)

我认为您使用Durandal API?

documentation表示属性名称是字符串。

  

observable.defineProperty

     

使用ES5 getter和setter定义计算属性。参数

     
      
  • obj:Object要在其上创建属性的目标对象。
  •   
  • propertyName:String   要定义的属性的名称。
  •   
  • evaluatorOrOptions:Function | object   Knockout计算函数或计算选项对象。
  •   
     

返回KnockoutObservable:基础计算的observable。

答案 1 :(得分:1)

得到答案(感谢Rob Eisenberg):

从v2.1开始,Durandal observable插件将包含getter。因此,除了上面的代码,我可以使用

获得打字稿的全部好处
get enableUpload(): boolean {
    return this.fileExists && this.createAs != null;;
}

和Durandal使它成为一个计算可观察的。