Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 敲除是否支持样式的双向绑定?_Knockout.js_Bidirectional - Fatal编程技术网

Knockout.js 敲除是否支持样式的双向绑定?

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&

例如,我希望将viewmodel中的属性绑定到元素的高度,以便在其高度发生更改时更新该属性。 我阅读了这个示例,但它只显示了一个方向绑定: ,表示更新属性将更新样式,但不会更新其他样式

我想做的事情是这样的:

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