2017-08-24 58 views
1

我有这个属性装饰,贯穿其中的转换器的属性值,所以我可以使用some-bindable-value="true"视图模板中:奥里利亚绑定值转换器(布尔等)

function valueConverter(converter: Function) { 
    return (target: any, key: string) => { 


     let definition = Object.getOwnPropertyDescriptor(target, key); 
     if (definition) { 
      Object.defineProperty(target, key, { 
       get: definition.get, 
       set: newValue => { 
        definition.set(converter(newValue)); 
       }, 
       enumerable: true, 
       configurable: true 
      }); 
     } else { 
      Object.defineProperty(target, key, { 
       get: function() { 
        return this['__' + key]; 
       }, 
       set: function (newValue) { 
        this['__' + key] = converter(newValue); 
       }, 
       enumerable: true, 
       configurable: true 
      }); 
     } 
    } 
} 

class App { 
    @valueConverter(value => value == 'true') public someBooleanValue; 

    constructor() { 
     this.someBooleanValue = 'false'; 
     console.log(this.someBooleanValue) // false 

     this.someBooleanValue = 'true'; 
     console.log(this.someBooleanValue) // true 
    } 

} 

这工作得很好,只要我也不使用@bindable修饰器(这使得它完全没有意义)。我是新来的装饰者,我不知道如何使这个工作与奥里利亚的财产观察机制。

+0

我有点困惑,你能描述一下你想做多一点吗?转换器在视图的binding属性中使用了一个像这样的管道:some-bindable-prop.bind =“mybinding | myconverter”'超越了这个你想要达到什么目的?一个codepen或什么也会有很大的帮助。 – 4imble

+0

无法在Aurelia中指定可绑定属性的类型。这意味着我不能像''那样做,只有'。第一种情况将是一个字符串。 [GitHub上的一个问题](https://github.com/aurelia/binding/issues/347)更深入地讨论了这个问题。我试图创建一个装饰器,将字符串属性转换为布尔值,所以值是一致的。我打算有多个转换器并将它们用作'@valueConverter(BooleanConverter)'。 – marekpw

+0

对不起,我没有意识到Aurelia已经在使用它。 – marekpw

回答

1

我想如果我试图完成这个,我首先复制bindable装饰器的代码,然后将自己的代码添加到它。它位于在这里:​​https://github.com/aurelia/templating/blob/master/src/decorators.js

这也可能有助于看看observable装饰是如何做的事情:https://github.com/aurelia/binding/blob/master/src/decorator-observable.js

看起来你可能需要把你的手很肮脏来完成你想要的东西。那幸福说,如果你能够做到这一点,我们很乐意在某个时候作为公关重新回到框架!

+0

我认为简单地编辑'bindable'装饰器来支持这个功能可能会容易得多。我会看看我能做些什么,如果有效,我会提交一份公关。 – marekpw

+0

它可能很好。希望你能弄清楚。我为你生根:-) –