2013-01-14 34 views
2

我有可观察到的结合一个textarea一个隐藏的div像这样内:可观察到的不更新时在一个隐藏的div

<span title="sales comment" data-bind="attr: { id: 'sales-'+year() }" style="cursor :pointer;"> 
<img src="information.png" alt="Add comment" />             
</span> 
<div data-bind="attr: { id: 'sales-'+year()+'_content' }" style="display : none;"> 
<textarea data-bind="value: salesComment, valueUpdate: 'keydown'"> </textarea> 
</div> 

和视图模型

var FinancialYearViewModel = function(data, parent) { 
    var self = this; 
    self.year = ko.observable(); 
    self.salesComment = ko.observable(); 
}; 

ko.applyBindings(new FinancialHistoryViewModel(data)); 

var data = {"year": "2012", "salesComment": "sales comment"} 

隐藏的div被用于填充这样一个qtip工具提示的内容:

$(document).ready(function() 
{ 
$("span[title]").each(function(i) {   
    content = $("#" + this.id + "_content").html(); 
    $(this).qtip({ content: { 
      text: content 
     },      
      show: { 
       event: 'click' 
      }, 
      hide: { event : 'unfocus'}       
    });      
    }); 
}); 

viewModel绑定ok,并且qtip显示隐藏div作为其cont根据需要。但是,当textarea值更改时,viewModel不会更新。

它的工作,当我删除div中内嵌CSS,即:

<div data-bind="attr: { id: 'sales-'+year()+'_content' }"> 
<textarea data-bind="value: salesComment, valueUpdate: 'keydown'"> </textarea> 
</div> 

但我需要为它的使用,只有当用户查看qtip隐藏默认div的内容。

任何想法为什么这个CSS是防止观察更新viewModel?

+0

如果div未隐藏,它是否仍会更新? ?我怀疑更新不会发生,因为qtip更改不会触发适当的事件。 –

回答

1

我认为问题在于,您将相应div的innerHTML内容作为qtip内容传递,这实际上意味着您复制了HTML并丢失了所有viewmodel绑定。

这里的问题行:

content = $("#" + this.id + "_content").html(); 

对于这个工作,qtip的内容需要完全一样的节点你已经绑定的视图模型相同的元素节点。

我还没有研究选项qtip接受的内容,但你有没有尝试过:

content = $("#" + this.id + "_content")[0]; 

[更新] - 我发现this thread,其中在此笔者的意见。因此,看起来您无法为版本1的qtip的内容使用相同的元素节点,但是您可以为qtip版本2执行此操作。

+0

不错。就是这样。我现在传入整个对象并且viewModel正在更新。实际的语法:内容= $(“#”+ this.id +“_content”) – Andrew

+0

我使用的版本2,所以现在都运行良好 – Andrew