【问题标题】:How do I force knockout to rebind a custom binding?如何强制淘汰赛重新绑定自定义绑定?
【发布时间】:2012-06-18 10:53:01
【问题描述】:

我想知道如何强制淘汰绑定来刷新它的值。通常我们使用一个 observable,这样当 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 是我的视图模型上的一个函数,它执行 JSON 调用以检索 HTML。

谢谢

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    我希望我能正确理解你想要完成的任务,但我不确定,所以让我解释一下我是如何理解你的目标的。

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

      $('#myDiv').html(serverResponseHTMLContent);

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

    如果这一切都正确,那么我建议你使用淘汰赛的 html 绑定。

    你的 div 应该是这样的。

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

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

    myDivInnerHtml = ko.observable(serverHtmlString);
    

    然后当您应用绑定时,myDiv 的内部 Html 将通过敲除设置。 要更新 html,您的客户端函数可以更改 myDivInnerHtml 的值。

    myDivInnerHtml(clientSideFunctionHtmlString);
    

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

    另外,如果客户端函数不是创建 html,而是要绑定到 html 的值,那么这也不起作用。

    【讨论】:

    • 感谢您的输入,HTML 会有所不同,因为在加载 html 后数据库中的某些值发生了变化,因此我想“刷新”html。我会看看是否可以按照您的建议找到一种方法来使用可观察对象来存储 html。谢谢。
    • 感谢您的建议。我最终为 html 创建了一个 observable。然后在异步 JSON 调用的成功处理程序中,我设置了 observable 的值。问题解决了:)谢谢!
    【解决方案2】:

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

    更多解释请参见How to force a view refresh without having it trigger automatically from an observable?

    【讨论】:

    • 感谢您的建议,但 getHtml 是一个函数,而不是一个 observable。我会看看我是否能找到一种方法来使用 valueHasMutated 和一个 observable 来让它工作。
    • 在黑暗中拍摄,但如果 getHtml 是一个获取 JSON 的函数,你可以看看这篇文章 knockmeout.net/2011/06/… - 我只是略读它,但它处理延迟加载 JSON 数据,所以可能会有所帮助.
    • 感谢延迟加载链接,它很有用。我最终使用了基于 Brian 上述回答的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多