javascript - 使用自定义绑定(bind)时如何更新 Knockout ViewModel

标签 javascript knockout.js viewmodel fuelux

我正在尝试将旋转框(带有递增和递减按钮的输入)连接到 KO,但在确保用户与控件交互时我的 ViewModel 正确更新方面遇到了一些麻烦。

我使用的具体控件是Fuel UX的SpinBox:http://getfuelux.com/javascript.html#spinbox

数据绑定(bind)本身附加到包装 div,因为它是整个控件的容器:

<div id="daysToComplete-spinner" data-initialize="spinbox" class="spinbox input-group" style="width: 150px;" data-bind="spinbox: daysToComplete, spinboxOptions: {min: 0, max: 180 }">
    <input class="form-control spinbox-input" placeholder="Days">
    <div class="spinbox-buttons input-group-btn">
        <button type="button" class="btn btn-cancel spinbox-up">
            <span class="fa fa-angle-up"></span><span class="sr-only">Increase</span>
        </button>
        <button type="button" class="btn btn-cancel spinbox-down">
            <span class="fa fa-angle-down"></span><span class="sr-only">Decrease</span>
        </button>
    </div>
</div>

我写了一个绑定(bind)处理程序,它似乎可以运行并构建控件,但是有几件事我很难实现:

  • 我想注册一个事件处理器。当用户单击向上或向下按钮(跨度)时,我需要确保使用新值更新 ViewModel 的属性。我试过使用 valueAccessor(),但它给了我值(value),而不是我期望的可观察属性(在阅读 ko 网站上的文档之后)。
  • 我想确保如果用户在输入框中键入数字,ViewModel 的属性会更新。数据绑定(bind)在 div 上,所以我假设 knockout 不会“知道”div 内的输入已经改变......我该如何完成这个?相同的事件处理程序?

这是我目前在处理程序上得到的信息:

$(function () {
    ko.bindingHandlers.spinbox = {
        init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

            var options = allBindingsAccessor().spinboxOptions || {};

            $(element).spinbox(options);

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

            if (value) {
                $(element).spinbox("value", value);
            }

            ko.utils.registerEventHandler(element, "changed.fu.spinbox", function (event, value) {
                var modelValue = valueAccessor(),
                modelValue(value); //it crashes here "not a function"

            });
        },
        update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
            var value = ko.utils.unwrapObservable(valueAccessor());
            $(element).spinbox("value", value);

            console.log(value);
        }
    };
});

任何关于我遗漏的指导都将不胜感激。

最佳答案

我不知道您的 View 模型是什么样的,但您能否确保在之前的操作中您没有用值覆盖可观察对象。

如果在某个时候你做了类似的事情:

viewmodel.daysToComplete = 4

然后 daysToComplete 属性不再是可观察的。 结果 valueAccessor() 不会返回可观察值,而是返回 4,这正是您所描述的。

关于javascript - 使用自定义绑定(bind)时如何更新 Knockout ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329819/

相关文章:

javascript - 何时使用 return,返回的数据会怎样?

javascript - Ruby on rails 的弹出窗口

javascript - 如何创建至少有 1 个框处于事件状态的复选框列表

javascript - myObservableArray.length 和 myObservableArray().length 之间的区别

asp.net-mvc - 如何在MVC 5中搭建 View 模型

javascript - Ajax 与 jQuery 同步。是否可以?

javascript - 为什么我的 Sequelize DB 不与 V6 同步?

javascript - 如何在单独的 'thread' 中或异步应用模板绑定(bind)?

asp.net-mvc - 当您的 View 模型没有与域模型一样多的字段时,您如何忽略/保留 MVC 中的值?

kotlin - 网络调用后,如何将数据从 Android 库传递到我的应用程序?