2012-10-19 57 views
1

我需要将click:事件中的数据传递到另一个div。这里是一个场景:KnockoutJS:将点击事件数据传递给div

页面的一边有一个链接。

<a data-bind="text: Name, click: $root.editAction"></a> 

在页面的另一边,有一个隐藏的div。

<div data-bind="if: $root.editActionShow"> 
    <input type="text" data-bind="value: Name"/> 
</div> 

我需要能够从click:事件传递$data,做隐藏股利。

也许我过想这,但我viewModel有很多不同的ActionsviewModel.DataGroups.DataGroup.ActionDataGroup深埋,并且只有1 HTML表单编辑操作的信息,所以我无法弄清楚如何使窗体只能说明我想要编辑的一个特定操作。

这是另一个踢球者。我不想在我的viewModel中添加任何可观察的事物。原因是我必须做.toJS()映射到最后,然后将JSON转换为XML,这必须针对严格的模式进行验证,因此有额外的元素是一件坏事。它不会通过验证,除非我在转换之前手动删除它们。但是,我可以将this.blah = function() {}对象添加到我的viewModel,因为.toJS()在转换过程中将它们剥离。

UPDATE:

AAAND解决这一切都是手了热闹

viewModel.editAction = function(data) { 
    viewModel.editActionFormShow(true); 
    ko.applyBindings(data, $('#myHiddenDiv')[0]); 
}; 

回答

1

据我了解,你想要的东西就像一个“点击编辑”功能,它可以是只用2个自定义绑定就能很好地解决问题!

这种方法的巨大优势是你不会监视你的viewModel与额外observables。

绑定:

ko.bindingHandlers.hidden = { 
    update: function(element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     ko.bindingHandlers.visible.update(element, function() { 
       return!value; }); 
     } 
    }; 

ko.bindingHandlers.clickToEdit = { 
    init: function(element, valueAccessor,allBindingsAccessor){ 
     var value = valueAccessor(), 
      input = document.createElement('input'), 
         link = document.createElement('a'); 

     element.appendChild(input); 
        element.appendChild(link); 

        value.isEditing = ko.observable(false); 

        ko.applyBindingsToNode(link,{ 
         text: value, 
         hidden: value.isEditing, 
         click: function(){ 
          value.isEditing(true); 
         } 
        }); 

     ko.applyBindingsToNode(input,{ 
      value: value, 
      visible: value.isEditing, 
          hasfocus: value.isEditing 
     }); 
    } 
}; 

视图模型

var vm = { 
    name: ko.observable() 
} 

的HTML

<div data-bind="clickToEdit: name"></div> 

工作小提琴:http://jsfiddle.net/8Qamd/

一切归功于瑞恩·尼迈耶。

+0

Anzeo,感谢您花时间编写解决方案。这不完全是我需要的,但给了我一个关于需要做什么的理想。我不需要进行编辑,因为我需要编辑的数据量远不止一个可观察的数据量,但我会考虑编写一个自定义绑定来实现这一点。再次感谢这个例子! – solefald

+0

@solefald,不客气。很高兴我能帮上忙! – thomaux