이 작업을 수행하는 한 가지 방법은 이벤트를 사용하는 것입니다.
사용자 지정 바인딩에 이벤트 이름을 전달하고 해당 이벤트를 구독 할 수 있습니다.
Durandal을 사용하고 있기 때문에 일반적으로 built-in event system을 사용하지만 jsFiddle에는 KnockoutJS 만 사용할 수 있으므로 다음 예제에서는 작은 위치 PubSub library을 사용합니다.
이 코드는 프로덕션에 투입되는 코드가 아닌 예제 코드입니다.
jsFiddle
//PubSub//
(function(a,c,b){if(typeof module!=="undefined"){module.exports=b(a,c)}else{if(typeof define==="function"&&typeof define.amd==="object"){define(b)}else{c[a]=b(a,c)}}})("radio",this,function(b,c){function a(d){a.$.channel(d);return a.$}a.$={version:"0.2",channelName:"",channels:[],broadcast:function(){var f,j=this.channels[this.channelName],d=j.length,g,h,e;for(f=0;f<d;f++){g=j[f];if((typeof(g)==="object")&&(g.length)){h=g[0];e=g[1]||c}h.apply(e,arguments)}return this},channel:function(d){var e=this.channels;if(!e[d]){e[d]=[]}this.channelName=d;return this},subscribe:function(){var f=arguments,j=this.channels[this.channelName],g,e=f.length,h,d=[];for(g=0;g<e;g++){d=f[g];h=(typeof(d)==="function")?[d]:d;if((typeof(h)==="object")&&(h.length)){j.push(h)}}return this},unsubscribe:function(){var g=arguments,k,h,n=this.channels[this.channelName],f=g.length,e=n.length,m=0,d;for(k=0;k<f;k++){m=0;e=n.length;for(h=0;h<e;h++){d=h-m;if(n[d][0]===g[k]){n.splice(d,1);m++}}}return this}};return a});
//PubSub//
ko.bindingHandlers.customBinding = {
_textBoxes: {},
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var _valueAccessor = valueAccessor();
var textBox = document.createElement("input");
textBox.type = "text";
element.appendChild(textBox);
ko.bindingHandlers.customBinding._textBoxes[element.id] = textBox;
if(_valueAccessor.clearEventName) {
radio(_valueAccessor.clearEventName).subscribe(function() {
_valueAccessor.text("");
});
}
if(_valueAccessor.text) {
textBox.onchange=function() { _valueAccessor.text(textBox.value); };
}
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var _valueAccessor = valueAccessor();
if(_valueAccessor.text) {
ko.bindingHandlers.customBinding._textBoxes[element.id].value = _valueAccessor.text();
}
}
};
var viewModel = {
text: ko.observable("Inital value."),
doClear: function() {
radio('clear').broadcast();
},
doReset: function() {
viewModel.text("Reset value.");
}
};
ko.applyBindings(viewModel);
왜 해키? – Anders
장면 뒤에서 무슨 일이 벌어지고 있는지 알려주지 않으므로 해키가 느껴집니다. Javascript는 이해할 수있는 코드로 인도하는 것으로 정확히 알려지지 않았지만 개발자는 그 길을 계속 시도 할 수 있습니다. – AndyJ
가상의 작업 솔루션에 대한 대안을 묻는 것은 조금 뒤늦게 느껴집니다. 솔루션을 구현 한 다음 개선을 요청하는 것이 더 좋지 않습니까? – RainerAtSpirit