2012-07-17 15 views
14

mam element, który posiada atrybut, którego wartość jest związana z nokautem obserwowalnym:Initialize Knockout obserwowalne od wartości atrybutu elementu

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

Po załadowaniu elementów Chciałbym obserwowalny zawierać wartość zdefiniowane w elemencie dOM, jednak zamiast ładuje jako niezdefiniowane i atrybut zostanie usunięty z elementu dOM alltogether:

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

jest to możliwe, t o zainicjować wartość nokautu dającą się zaobserwować z atrybutu elementu DOM i również zachować wartość atrybutu elementu dom?

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

Odpowiedz

19

Innym rozwiązaniem byłoby wykorzystanie zwyczaj wiązania i zebrać aktualną wartość elementu w funkcja init. Moim zdaniem, jest to o wiele bardziej wielokrotnego użytku.

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)) 
    } 
}; 

Oczywiście, będzie twoja być bardziej skomplikowana, ponieważ trzeba być robi coś z tym właściwości transform. Ta logika prawdopodobnie będzie chciała przejść do sekcji update.

5

atrybuty danych wiązania nie są przetwarzane do czasu wywołania ko.applyBindings(). Jeśli więc chcesz pobrać dane atrybutów z elementów, możesz to zrobić w ten sposób.

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

ko.applyBindings(new MyModel()); 

zasadniczo chwyta się wartość atrybutu i ustawia go jako wartość początkową obserwowalnego. atrybuty wiązania danych mają być szablonem, więc wartości początkowe lub domyślne powinny być określone w ViewModelu.

druga opcja jest napisanie własnego spoiwo, które mogą przechowywać domyślne jeśli obserwowalne zwraca null ...

+0

Dzięki, ale poszedłem z niestandardowym uchwytem. Zakodowane domyślnie wartości inicjowanych obserwowalnych nie są tym, czego szukam w tym przypadku, ponieważ wartość atrybutu elementu będzie różna w zależności od tego, który z nich jest załadowany. – KodeKreachor

Powiązane problemy