我有这个功能:
function make(place)
{
place.innerHTML = "somthing"
}
我曾经使用纯 JavaScript 和 html 来做到这一点:
<button onclick="make(this.parent)">click me</button>
如何使用惯用的 knockout.js 做到这一点?
我有这个功能:
function make(place)
{
place.innerHTML = "somthing"
}
我曾经使用纯 JavaScript 和 html 来做到这一点:
<button onclick="make(this.parent)">click me</button>
如何使用惯用的 knockout.js 做到这一点?
使用绑定,如下例所示:
<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);
};
}();
如果您在 Knockout 中设置了单击绑定,则该事件将作为第二个参数传递。您可以使用该事件来获取发生单击的元素并执行您想要的任何操作。
这是一个演示的小提琴:http: //jsfiddle.net/jearles/xSKyR/
或者,您可以创建自己的自定义绑定,它将接收绑定到的元素作为第一个参数。在初始化时,您可以附加自己的单击事件处理程序来执行您希望执行的任何操作。
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());
我知道这是一个老问题,但这是我的贡献。您可以简单地将一个函数包装在另一个函数中,而不是所有这些技巧。就像我在这里所做的那样:
<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());
这是小提琴
关于如何click
使用 KnockoutJS 处理事件的通用答案...
不是对所问问题的直接答案,但可能是对大多数谷歌人登陆这里的问题的答案:使用来自 KnockoutJS的click
绑定而不是onclick
. 像这样:
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>
**关于实际问题的注释...*
实际问题有一个有趣的地方:
// Uh oh! Modifying the DOM....
place.innerHTML = "somthing"
不要那样做!当使用像 KnockoutJS 这样的 MVVM 框架时,不要像那样修改 DOM,尤其是你自己的父 DOM 部分。如果你这样做,按钮就会消失(如果你替换你父母的innerHTML
,你自己将永远消失!)。
相反,改为在您的处理程序中修改视图模型,并让视图响应。例如:
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>
Knockout 的文档还提到了一种更简洁的方法,可以将额外参数传递给on-click
使用 function.bind 的绑定绑定的函数,如下所示:
<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">
Click me
</button>