2012-07-17 34 views
14

我有擁有它的值綁定到淘汰賽觀察到的屬性的元素:初始化淘汰賽從元素屬性值觀測的

<text transform='matrix(1 0 0 1 1 1)' data-bind='attr:{transform:textTransform}'></text>

當元素加載,我想可觀察到包含值定義的DOM元素上,然而,它不是加載爲未定義和屬性從DOM元素產品總數去除:

<text data-bind='attr:{transform:textTransform}'></text>

是否有可能噸o從dom元素屬性初始化knockout observable的值,並堅持dom元素屬性的值?

UPDATE:http://jsfiddle.net/5Z2SC/10/

回答

19

另一種選擇是使用自定義綁定,並收集元素的當前值init函數。在我看來,這是更加可重用的。

ko.bindingHandlers.transform = { 
    init: function(element, valueAccessor) { 
     valueAccessor()(element.getAttribute('transform')); 
    }, 
    update: function(element, valueAccessor) { 
     var value = valueAccessor(); 
     element.setAttribute('transform', ko.utils.unwrapObservable(value)) 
    } 
}; 

當然,你會更加複雜,因爲你必須做東西與此轉換屬性。該邏輯可能會在update部分進行。

5

數據綁定屬性不被解析,直到調用ko.applyBindings()。所以如果你需要從你的元素中獲取屬性數據,你可以這樣做。

function MyModel(){ 
    this.textTransform = ko.observable($('#myElement').attr('transform')); 
} 

ko.applyBindings(new MyModel()); 

基本上,您正在抓取該屬性的值並將其設置爲可觀察值的初始值。數據綁定屬性應該是一個模板,所以應該在ViewModel中指定初始值或默認值。

的另一種選擇是編寫自定義的粘合劑,可以存儲一個缺省的,如果觀察到的返回空...

+0

謝謝,但我去了自定義綁定處理程序。在這種情況下,初始化的可觀察對象的硬編碼默認值不是我要查找的,因爲元素屬性值根據加載哪個元素屬性而不同。 – KodeKreachor 2012-07-17 17:04:33