【问题标题】:Knockout style binding does not update Left and TopKnockout 样式绑定不更新 Left 和 Top
【发布时间】:2017-06-22 09:47:43
【问题描述】:

我在敲除样式绑定中遇到了以下问题:我正在尝试构建带有节点的编辑器。还有一个小地图,应该跟随编辑器的节点并在编辑器上显示它们及其移动。小地图上节点及其“克隆”的位置应该是同步的。

HTML:

<div id="minimap">
            <div id="minimap_panner" data-bind="style: { height: dimensions.height + 'px', width: dimensions.width + 'px' }">
                <!-- ko foreach: { data: nodePositions() } -->
                <div class="minimap-node-item" data-bind="style: { left: X + 'px', top: Y + 'px' }"></div>
                <!-- /ko -->
            </div>
        </div>

JS:

ko.applyBindings({
            nodePositions: ko.computed(function () {
                var nodes = model.displayedNodes()();

                return nodes.map(function (node) {
                    return ko.observable(node.Position);
                });
            }),
            dimensions: ko.computed(function () {                     
                return { width: editorElement.scrollWidth, height: editorElement.scrollHeight };
            })
        }, minimapPanner);

每个节点的Position属性保存一个对象{ X, Y }。

问题:

  1. 最初在小地图上渲染“克隆”时,它们的位置是正确的。但是当我在编辑器上移动一个节点时,它在小地图上的“克隆”不会改变它的位置,即使我在 Knockout 上下文(浏览器扩展)上看到了变化。我的意思是:“克隆”的上下文已更改,但其绑定样式属性(左侧和顶部)保持原样。

编辑:X 和 Y 似乎不可观察 - 这可能会回答问题?!

2. (已在 cmets 中解决)当 minimap panner 元素最初被渲染时,它的绑定属性 heightwidth 实际上并未绑定。我再次可以在 Konockout 上下文中看到它们的值已更新 - “维度”:对象 身高:977 宽度:1050 但没有应用于元素的此类样式。

【问题讨论】:

  • scrollWidthscrollHeight Position 的属性吗?它们是可观察的吗?在地图中,您将 Position 创建为 observable,但不是其内容。
  • scrollWidth 和 scrollHeight 是 DOM 元素的属性。位置是可观察的,它的属性 X,Y 不是,但它们在 Knockout 上下文中更新,这是我所期望的。它们不会在标记中更新。
  • 在此链接knockoutjs.com/documentation/computedObservables.html 中,它表示计算的可观察对象取决于一个或多个可观察对象。在你的 dimensions 计算的 observable 中,scrollWidthscrollHeight 应该都是 observables。
  • 你是对的!问题 2. 的绑定将变为 dimensions: ko.computed(function () { return { width:ko.observable(editorElement.scrollWidth), height: ko.observable(editorElement.scrollHeight) }; }) 并且 panner 元素的绑定将变为 &lt;div id="minimap_panner" data-bind="style: { height: dimensions().height() + 'px', width: dimensions().width() + 'px' }"&gt;

标签: javascript html knockout.js data-binding


【解决方案1】:

似乎 X 和 Y 是不可观察的,只是常规属性?!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2018-12-08
    • 2013-08-22
    • 2015-06-01
    • 2016-08-18
    • 2011-09-19
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多