Tengo esta función:
function make(place)
{
place.innerHTML = "somthing"
}
Yo solía hacer esto con JavaScript simple y html:
<button onclick="make(this.parent)">click me</button>
¿Cómo puedo hacer esto usando knockout.js idiomática?
Utilice un enlace, como en este ejemplo:
<a href="#new-search" data-bind="click:SearchManager.bind($data,'1')">
Search Manager
</a>
var ViewModelStructure = function () {
var self = this;
this.SearchManager = function (search) {
console.log(search);
};
}();
Si configuras un enlace de clic en Knockout, el evento se pasa como segundo parámetro. Puedes utilizar el evento para obtener el elemento en el que se ha producido el clic y realizar la acción que desees.
Aquí hay un fiddle que lo demuestra:
Alternativamente, puedes crear tu propio binding personalizado, que recibirá el elemento al que está vinculado como primer parámetro. En init usted podría adjuntar su propio controlador de eventos de clic para hacer las acciones que desee.
http://knockoutjs.com/documentation/custom-bindings.html
HTML
<div>
<button data-bind="click: clickMe">Click Me!</button>
</div>
Js
var ViewModel = function() {
var self = this;
self.clickMe = function(data,event) {
var target = event.target || event.srcElement;
if (target.nodeType == 3) // defeat Safari bug
target = target.parentNode;
target.parentNode.innerHTML = "something";
}
}
ko.applyBindings(new ViewModel());
Sé que esta es una pregunta vieja, pero aquí está mi contribución. En lugar de todos estos trucos, usted puede simplemente envolver una función dentro de otra función. Como he hecho aquí:
<div data-bind="click: function(){ f('hello parameter'); }">Click me once</div>
<div data-bind="click: function(){ f('no no parameter'); }">Click me twice</div>
var VM = function(){
this.f = function(param){
console.log(param);
}
}
ko.applyBindings(new VM());
Y aquí está el [fiddle][1]