14

我有一个元素,该元素拥有一个属性,其值绑定到可观察到的淘汰赛:

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

当元素加载时,我希望 observable 包含在 dom 元素上定义的值,但是它加载为 undefined 并且该属性从 dom 元素中全部删除:

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

是否可以从 dom 元素属性初始化可观察到的淘汰赛的值并保持 dom 元素属性的值?

更新:http: //jsfiddle.net/5Z2SC/10/

4

2 回答 2

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部分。

于 2012-07-17T16:23:34.257 回答
5

在调用 ko.applyBindings() 之前,不会解析数据绑定属性。因此,如果您需要从元素中获取属性数据,您可以这样做。

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

ko.applyBindings(new MyModel());

基本上,您正在获取属性的值并将其设置为可观察对象的初始值。data-bind 属性是一个模板,因此应在 ViewModel 中指定初始值或默认值。

另一种选择是编写一个自定义活页夹,如果 observable 返回 null 则可以存储默认值...

于 2012-07-17T16:02:46.533 回答