2017-08-24 56 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

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