Knockout.js 敲除是否支持样式的双向绑定?
例如,我希望将viewmodel中的属性绑定到元素的高度,以便在其高度发生更改时更新该属性。 我阅读了这个示例,但它只显示了一个方向绑定: ,表示更新属性将更新样式,但不会更新其他样式 我想做的事情是这样的:Knockout.js 敲除是否支持样式的双向绑定?,knockout.js,bidirectional,Knockout.js,Bidirectional,例如,我希望将viewmodel中的属性绑定到元素的高度,以便在其高度发生更改时更新该属性。 我阅读了这个示例,但它只显示了一个方向绑定: ,表示更新属性将更新样式,但不会更新其他样式 我想做的事情是这样的: <div class="panel-body" data-bind="style: {height: chatParentHeight}"> <div data-bind="style: { height: chatHeight}"> </div&
<div class="panel-body" data-bind="style: {height: chatParentHeight}">
<div data-bind="style: { height: chatHeight}">
</div>
</div>
在视图模型中:
self.chatParentHeight=ko.observable()代码>
self.chatHeight=self.chatParentHeight()代码>
因此,将监视父元素的高度是否发生更改,如果发生更改,它也会更改子元素的高度,因为它已绑定到子元素。但是,当高度样式更新时,viewmodel不会更新。我也尝试使用backgroundColor来简化它,但效果不太好。确定可以在视图模型中使用ko计算
self.chatParentHeight = ko.observable();
self.chatHeight = ko.computed(function(){
return self.chatParentHeight();
});
子元素在视图模型中没有更改的原因是,子元素根本不是可观察的,而是在创建视图模型时,为其指定了self.chatParentHeight值。但是因为它实际上不是一个可观察的,所以当高度改变时,改变事件不会触发。ko computed对象创建一个相关的observable来更改高度,并自动检测父级高度何时更改,并重新计算聊天高度的值。您的标题中的问题可以使用敲除源来回答:它是开放的,实际上非常容易通过。引述:
所以答案是“否”:绑定不是双向的,但同样也是“是”,因为您可以自己编写一个
如果你的问题实际上不同,更多关于如何将两个高度关联起来的问题,那么请查看。这有点乐观,不是吗:D你必须为此创建一个自定义绑定。我花了很长时间才理解我必须这样编写:data bind=“style:{height:chatParentHeight()+'px}
Hehe,我曾经有过这样的经历。尽管我建议您使用ViewModel,这样您就可以对其进行单元测试并保持视图更清晰。这正是我所做的!谢谢。
ko.bindingHandlers['style'] = {
'update': function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor() || {});
ko.utils.objectForEach(value, function(styleName, styleValue) {
styleValue = ko.utils.unwrapObservable(styleValue);
if (styleValue === null || styleValue === undefined || styleValue === false) {
// Empty string removes the value, whereas null/undefined have no effect
styleValue = "";
}
element.style[styleName] = styleValue;
});
}
};