Инициализировать Knockout, наблюдаемый из значения атрибута элемента

У меня есть элемент, который обладает атрибутом, значение которого привязано к наблюдаемому нокауту:

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

Когда элемент загружается, я бы хотел, чтобы наблюдаемое содержало значение, определенное в элементе dom, однако вместо этого оно загружается как неопределенное, а атрибут полностью удаляется из элемента dom:

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

Можно ли инициализировать значение нокаута, наблюдаемого из атрибута элемента dom, а также сохранить значение атрибута элемента dom?

ОБНОВЛЕНИЕ: http://jsfiddle.net/5Z2SC/10/


person KodeKreachor    schedule 17.07.2012    source источник


Ответы (2)


Другой вариант — использовать пользовательскую привязку и собирать текущее значение элемента в функции инициализации. На мой взгляд, это гораздо более многоразовое использование.

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.

person Kyeotic    schedule 17.07.2012

атрибуты привязки данных не анализируются, пока вы не вызовете ko.applyBindings(). Поэтому, если вам нужно получить данные атрибутов ваших элементов, вы можете сделать это следующим образом.

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

ko.applyBindings(new MyModel());

в основном, вы берете значение атрибута и устанавливаете его в качестве начального значения наблюдаемого. атрибуты привязки данных предназначены для использования в качестве шаблона, поэтому в вашей ViewModel должны быть указаны начальные значения или значения по умолчанию.

другой вариант - написать собственный связующий элемент, который может хранить значение по умолчанию, если наблюдаемый возвращает значение null...

person Master Morality    schedule 17.07.2012
comment
Спасибо, но я выбрал пользовательский обработчик привязки. Жестко закодированные значения по умолчанию для инициализированных наблюдаемых — это не то, что мне нужно в этом случае, поскольку значение атрибута элемента будет отличаться в зависимости от того, какой из них загружен. - person KodeKreachor; 17.07.2012