【问题标题】:Manipulate with DOM elements on Knockoutjs "before-value-changed"使用 Knockoutjs 上的 DOM 元素“更改值之前”进行操作
【发布时间】:2023-04-01 04:47:01
【问题描述】:

比方说,我只是有一个常见的 Knockoutjs 布局/方法:

    function User(data) {
        this.name = ko.observable(data.name);
    }

    function UsersViewModel() {
        var self = this;

        self.users = ko.observableArray([]);
    }

    var viewModel = new UsersViewModel();
    service.initialize(viewModel);
    ko.applyBindings(viewModel);

和 HTML:

<ul data-bind="foreach: users">
    <li>
        <span data-bind="text:name"></span>
    </li> 
</ul>

我想要的是在 Knockoutjs 中对数据更改应用一些漂亮的动画现有 DOM 元素平滑消失(这需要一些时间,而消失结束),在此之后(或什至在开始消失时)在出现的新元素上开始动画。 (在这个例子中——“li”元素会随着每个元素单独的动画而单独消失(每个元素之间会有一些延迟)(但这并不重要))。

(我认为这里将完全替换元素(假设新数据包含具有相同 id 的项目时不要太在意……这很复杂,我理解)。

据我所知,这可能非常困难,我应该考虑更改/扩展 Knockoutjs 源(对吗?)以处理“start-disappearing-animation ", "disappearing-animation-finished", "start-appearing-animation"。

但至少有什么方法防止敲除删除现有的 DOM 元素让我手动处理)...某种“分离”它们的方法来自容器。

或者,如果没有其他可能,那么只是“在数据更改之前开启”事件?

谢谢!

【问题讨论】:

  • 查看custom bindings 上的文档,他们有一个动画过渡示例,您可以将其扩展到您需要的任何内容。
  • Hm... 但这似乎“更新”回调是为了刷新某些元素的状态(以防万一,如果在我的示例中,某些 name 中的某些 user 数据对象会更改) ,但不允许在某些新元素出现/消失(即移除/创建 DOM 对象)之后(尤其是之前)实际调用动画。
  • 无论哪种方式,您正在寻找的是自定义绑定处理程序。
  • 你能说得更具体点吗?正如我上面刚刚提到的,我看不出怎么可能有类似“处理/删除”之类的东西(与自定义绑定中的“更新”相反)。

标签: javascript dom animation data-binding knockout.js


【解决方案1】:

您可以使用自定义绑定来更新元素。

然后,您将能够在自己更新元素之前和之后做您想做的事情。

通用示例:

ko.bindingHandlers.textAnimated = {
    update: function(element, valueAccessor) {
        var value = valueAccessor();

        var valueUnwrapped = ko.utils.unwrapObservable(value);

        // Before changing value
        // Do something

        $(element).text(valueUnwrapped);        

        // After changing value
        // Do something else
    } 
};

自定义绑定淡出旧值,然后淡入新值,然后在控制台上打印的示例:

ko.bindingHandlers.textAnimated = {
    update: function(element, valueAccessor) {
        var value = valueAccessor();

        var valueUnwrapped = ko.utils.unwrapObservable(value);

        $(element).fadeOut('slow', function() {
            $(element).text(valueUnwrapped);       

            $(element).fadeIn('slow', function() {
                console.log('done');
            });
        });
    } 
};

See the JSFiddle

【讨论】:

  • 感谢您的回答,不过我正在寻找另一件事。我需要的不是title 更改(和指示),而是容器&lt;ul data-bind="foreach: users"&gt;。不过,我也可以尝试类似的方法。
猜你喜欢
  • 1970-01-01
  • 2020-03-30
  • 2018-01-17
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2014-03-31
相关资源
最近更新 更多