如何强制knockout重新绑定自定义绑定?

时间:2012-06-15 11:05:46

标签: javascript knockout.js

我想知道如何强制敲除绑定来刷新它的价值。通常我们使用一个observable,当可观察的变化时,绑定可以自动发生。但在我的情况下,我创建了一个自定义绑定:

if (!ko.bindingHandlers.asyncHtml) {
ko.bindingHandlers.asyncHtml = {
    init: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        var parameters = value.params.concat([function (data) {
            $(element).html(data);
        } ]);

        parameters.concat([function (data) {
            $(element).html('Unable to retrieve html.');
        } ]);
        value.source.apply(null, parameters);
    }
}
}

这样,执行异步JSON调用的函数可以在调用完成后更新相应的元素(使用返回的HTML)。元素,在这种情况下为DIV,如下所示:

<div id="myDiv" data-bind="asyncHtml: {source: getHtml, params: [myId()]}">

我的问题是,此页面上的另一个功能可能会更改需要 myDiv 更新的数据库值。我可能会找到一个复杂的方法来纠正这个问题,但我想知道是否有一种更简单的方法可以强制绑定重新应用?

注意:getHtml是我的viewmodel上的一个函数,它执行JSON调用以检索HTML。

谢谢

2 个答案:

答案 0 :(得分:3)

我希望我明白你想要正确地完成什么,但我不确定,所以让我解释一下我如何理解你的目标。

  1. 你有一个div(#myDiv),它将从服务器检索它的初始HTML。
  2. 你有一个ajax函数(getHtml),可以检索这个html和onSuccess更新#myDiv,可能是这样的:

    $( '#myDiv')HTML(serverResponseHTMLContent);

  3. 然后你有另一个可能产生不同HTML的函数,它应取代服务器生成的html。

  4. 如果这一切都正确,那么我建议你使用knockout的html绑定。

    你的div会是这样的。

    <div id="myDiv" data-bind="html: myDivInnerHtml">
    

    myDivInnerHtml将成为您的viewModel的一部分,并且应该像您通常所做的那样是一个可观察的。 在初始绑定之前,调用getHtml并让它设置myDivInnerHtml的值,而不是实际为myDiv设置html。

    myDivInnerHtml = ko.observable(serverHtmlString);
    

    然后当你应用绑定时,myDiv的内部Html将由knockout设置。 要更新html,您的客户端功能可以更改myDivInnerHtml的值。

    myDivInnerHtml(clientSideFunctionHtmlString);
    

    如果我的假设是错误的并且您重新创建了具有不同值的相同html,那么您应该使用模板(如果可能)并且服务器不应该发送html,而是将值绑定到html。

    另外,如果客户端功能没有创建html,而是将值绑定到html,那么这也不起作用。

答案 1 :(得分:2)

您可以查看valueHasMutated()函数,该函数通知订阅者他们应该重新评估可观察量。

请参阅How to force a view refresh without having it trigger automatically from an observable?了解更多信息。