首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery DOM操作来自Knockout ViewModel -使用bindingHandlers?

jQuery DOM操作来自Knockout ViewModel -使用bindingHandlers?
EN

Stack Overflow用户
提问于 2015-04-29 14:35:32
回答 1查看 348关注 0票数 0

我有一个很棒的viewModel,它看起来像这样:

代码语言:javascript
复制
function myViewModel() {
    this.update = function() {
        ...
    }
    ...
}

和一个看起来像这样的bindingHandler:

代码语言:javascript
复制
ko.bindingHandlers.myBindingHandler = {
    init: function(element, valueAccessor, allBindings, viewModel) {
        function manipulateDom(element) {
            ...
        }
    }
}

每当调用update方法时,我希望myViewModel调用manipulateDom。

我可以使用bindingHandler中的回调集来完成这个任务:

代码语言:javascript
复制
function myViewModel() {
    this.update = function() {
        ...
        this.myBindingHandlerCallback();
    }
    ...
}

ko.bindingHandlers.myBindingHandler = {
    init: function(element, valueAccessor, allBindings, viewModel) {
        viewModel.myBindingHandlerCallback = manipulateDom.bind(null, element);
    }
}

<div data-bind="myBindingHandler: null"></div>

我的另一个想法是使用可观察到的“updateCount”,并在bindingHandler中订阅它:

代码语言:javascript
复制
function myViewModel() {
    this.updateCount = ko.observable(0);
    this.update = function() {
        ...
        this.updateCount(this.updateCount() + 1);
    }
    ...
}

ko.bindingHandlers.myBindingHandler = {
    update: function(element) {
        manipulateDom(element);
    }
}

<div data-bind="myBindingHandler: updateCount"></div>

这两种解决方案都让人感到脆弱和混乱。解决这类问题的“击倒”方法是什么?我应该只是在viewModel内部操作DOM吗?

我要补充的是,manipulateDom函数有许多逻辑不适用于敲除方式(测量窗口高度、测量DIV高度等)。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-29 15:47:01

第二种方法(使用计数器)要好得多,因为ViewModel不应该通过覆盖它的属性来覆盖和更改ViewModel的行为。

如果您的update方法对其他可观察到的属性做了一些更改,那么我将创建一个计算属性,它将订阅ViewModel的当前状态,并自动调用DOM操作绑定,如果您将它作为绑定参数传递,那么不需要增加计数器或任何其他标志。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29946858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档