2012-06-15 58 views
2

我想知道如何强制淘汰赛的绑定来刷新它的价值。通常我们使用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是我的viewmodel上执行JSON调用来检索HTML的函数。

感谢

回答

2

我希望我能理解你正在努力完成的任务,但我不确定,所以让我解释我如何理解你的目标。

  1. 您有一个div(#myDiv),它将从服务器检索它的初始HTML。
  2. 您有一个AJAX功能(getHtml)来检索这个网站和的onSuccess更新#myDiv,可能与此:

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

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

如果这一切都正确,那么我会建议你使用敲除的HTML绑定。

你的div看起来像这样。

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

myDivInnerHtml会是您的视图模型的一部分,就像你说的,你平时要做的应该是可观察的。 在初始绑定之前,调用getHtml并让它为myDivInnerHtml设置值,而不是实际设置myDiv的html。

myDivInnerHtml = ko.observable(serverHtmlString); 

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

myDivInnerHtml(clientSideFunctionHtmlString); 

如果我的假设是错误的,你必须重新创建具有不同的值相同的HTML,那么你应该尽可能使用模板和服务器不应该发送HTML,而是价值观绑定到HTML 。另外,如果客户端函数不是创建html,而是绑定到html的值,那么这也不起作用。

+0

感谢您的输入,HTML会有所不同,因为在加载html之后,数据库中的某些值已更改,因此我想“刷新”html。我会看看我是否可以找到一种方法来使用可观察值来存储您所建议的html。谢谢。 –

+0

感谢您的建议。我最终为html创建了一个observable。然后,在异步JSON调用的成功处理程序中,我设置了observable的值。问题解决了:)谢谢! –

2

你可以看一下valueHasMutated()功能,用户通知他们应该重新评估观察到的。

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

+0

感谢您的建议,但getHtml是一个功能,而不是可观察的。我会看看我是否可以找到一种方法来使用valueHasMutated和一个observable来使它工作。 –

+1

在黑暗中拍摄,但如果getHtml是一个获取JSON的函数,你可以看看这篇文章http://www.knockmeout.net/2011/06/lazy-loading-observable-in-knockoutjs.html - 我已经只有skim阅读它,但它处理延迟加载JSON数据,所以可能会有所帮助。 –

+0

感谢您的延迟加载链接,它很有用。我最终根据Brian的回答使用了一个解决方案。 –

相关问题