Eine generische Antwort auf wie click
Ereignisse mit KnockoutJS zu handhaben ...
nicht eine gerade nach oben Antwort auf die Frage: Wie ich hier getan habe Wie gesagt, aber wahrscheinlich eine Antwort auf die Frage, die die meisten Googler hier haben: benutze the click
binding from KnockoutJS statt onclick
. Wie folgt aus:
function Item(parent, txt) {
var self = this;
self.doStuff = function(data, event) {
console.log(data, event);
parent.log(parent.log() + "\n data = " + ko.toJSON(data));
};
self.doOtherStuff = function(customParam, data, event) {
console.log(data, event);
parent.log(parent.log() + "\n data = " + ko.toJSON(data) + ", customParam = " + customParam);
};
self.txt = ko.observable(txt);
}
function RootVm(items) {
var self = this;
self.doParentStuff = function(data, event) {
console.log(data, event);
self.log(self.log() + "\n data = " + ko.toJSON(data));
};
self.items = ko.observableArray([
new Item(self, "John Doe"),
new Item(self, "Marcus Aurelius")
]);
self.log = ko.observable("Started logging...");
}
ko.applyBindings(new RootVm());
.parent { background: rgba(150, 150, 200, 0.5); padding: 2px; margin: 5px; }
button { margin: 2px 0; font-family: consolas; font-size: 11px; }
pre { background: #eee; border: 1px solid #ccc; padding: 5px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<div data-bind="foreach: items">
<div class="parent">
<span data-bind="text: txt"></span><br>
<button data-bind="click: doStuff">click: doStuff</button><br>
<button data-bind="click: $parent.doParentStuff">click: $parent.doParentStuff</button><br>
<button data-bind="click: $root.doParentStuff">click: $root.doParentStuff</button><br>
<button data-bind="click: function(data, event) { $parent.log($parent.log() + '\n data = ' + ko.toJSON(data)); }">click: function(data, event) { $parent.log($parent.log() + '\n data = ' + ko.toJSON(data)); }</button><br>
<button data-bind="click: doOtherStuff.bind($data, 'test 123')">click: doOtherStuff.bind($data, 'test 123')</button><br>
<button data-bind="click: function(data, event) { doOtherStuff('test 123', $data, event); }">click: function(data, event) { doOtherStuff($data, 'test 123', event); }</button><br>
</div>
</div>
Click log:
<pre data-bind="text: log"></pre>
** Eine Notiz über die tatsächlichen Frage ... *
Die eigentliche Frage hat eine interessante Bit:
// Uh oh! Modifying the DOM....
place.innerHTML = "somthing"
Tun Sie das nicht! Ändern Sie das DOM nicht so, wenn Sie ein MVVM-Framework wie KnockoutJS verwenden, insbesondere nicht das Teil des DOM, das Ihr eigenes Elternelement ist. Wenn Sie würde dies tun, würde die Schaltfläche verschwinden (wenn Sie ersetzen Ihre Eltern innerHTML
Sie selbst werden für immer verschwunden sein!).
Stattdessen ändern die Ansicht Modell in Ihrem Handler statt, und die Ansicht reagieren. Zum Beispiel:
function RootVm() {
var self = this;
self.buttonWasClickedOnce = ko.observable(false);
self.toggle = function(data, event) {
self.buttonWasClickedOnce(!self.buttonWasClickedOnce());
};
}
ko.applyBindings(new RootVm());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>
<div>
<div data-bind="visible: !buttonWasClickedOnce()">
<button data-bind="click: toggle">Toggle!</button>
</div>
<div data-bind="visible: buttonWasClickedOnce">
Can be made visible with toggle...
<button data-bind="click: toggle">Untoggle!</button>
</div>
</div>
jsfiddle Version : http://jsfiddle.net/fiddleSt1ck5/agjt6/ – fiat
Danke. Aber was, wenn ich mehr als einen Parameter übergeben möchte? Wie würde ich das tun? – sudip
@sudip Einfach: klicken: PesquisaGerente.bind ($ data, '1', '2', '3') – pimbrouwers