使用knockout-utils陷入麻烦

时间:2014-04-18 17:35:42

标签: javascript jquery knockout.js spinner

我有这个微调器。

设置好后,控件显示正确的值,没有错误信息,但如果我更改它,每次收到此错误信息时:

“TypeError:observable不是函数”

在这一行:

observable($(element).spinner("value"));

这是我的自定义绑定中的一行,如下所示:

ko.bindingHandlers.spinner = {
  init: function (element, valueAccessor, allBindingsAccessor) {
    //initialize datepicker with some optional options
    var options = allBindingsAccessor().spinnerOptions || {};


    $(element).spinner(options);

    //handle the field changing
    ko.utils.registerEventHandler(element, "spinchange", function () {
        //var observable = valueAccessor();
        var observable = ko.utils.unwrapObservable(valueAccessor());
        observable($(element).spinner("value"));
    });

    //handle disposal (if KO removes by the template binding)
    ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
        $(element).spinner("destroy");
    });

  },
  update: function (element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor()),
        current = $(element).spinner("value");

    if (value !== current) {
        $(element).spinner("value", value);
    }
  }
};

如果我将失败的行与注释掉的那行交换:

var observable = valueAccessor();

它工作正常。 为什么第一个失败?

1 个答案:

答案 0 :(得分:3)

在自定义绑定中,valueAccessor是一个function,它返回绑定的值,所以你在"右侧"在绑定中。

因此,在data-bind="spinner: yourValue的情况下,您将获得yourValue属性的内容。

如果您的yourValueko.observable,那么在var observable = valueAccessor();中,observable将包含您yourValue var observable = valueAccessor(); observable($(element).spinner("value")); 的实际可观察​​功能现在可以将它设置为任何值:

ko.utils.unwrapObservable(valueAccessor());

因此,在这种情况下,这是正确的用法,因为您需要引用和使用您的可观察函数而不是它的值。

但是如果你使用valueAccessor()();,它会自动解开你的observable,所以你会以一个值而不是一个函数结束。所以这个调用大致相当于写vm = { yourValue: ko.observable(5); }

因此,如果您的视图模型如下所示:

var observable = ko.utils.unwrapObservable(valueAccessor());
observable($(element).spinner("value"));

当你写:

observable

5将包含值{{1}}而不是函数,因此您可以获得上述异常。