J'essaie d'ajouter un événement de clic à mon bouton qui enverra l'identifiant, la catégorie et le nom en tant que paramètres uniquement lorsque l'utilisateur clique sur le bouton.
<tbody data-bind="foreach: tehTab()">
<tr>
<td data-bind="text: $data.Category"></td>
<td data-bind="text: $data.Name"></td>
<td>
<button type="button" class="btn chart_btn" role="button" data-toggle="popover" data-trigger="focus" data-html="true" data-placement="right" container="body" tabindex="0" data-original-title="" title="" style="border:none; background-color:white" data-bind="attr: { id: $data.Id,'data-contentwrapper':'.chartdraw' + $data.Id},click: getLast7($data.Id, $data.Category, $data.Name) , text:$data.Value"></button>
<div data-bind="css: 'chartdraw' + $data.Id" class="chartdrawetc" style="display:none">ASD</div>
</td>
</tr>
</tbody>
même si j'essaie de changer:
click: getLast7($data.Id, $data.Category, $data.Name)
avec
attr: { id: $data.Id ,onclick: getLast7($data.Id, $data.Category, $data.Name)
il déclenche toujours la méthode getLast7 autant de fois que la longueur de tehTab.
Qu'est-ce que je fais mal?
Ajouter ()
après le nom de la fonction l’appellera. Vous devrez utiliser .bind
click: getLast7.bind(this, $data.Id, $data.Category, $data.Name)
function vm(){
this.notify = function(str){
console.log(str)
}
}
ko.applyBindings(new vm())
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
<div data-bind="click: notify.bind(this, 'Hello')">Click me</div>
Même si vous pouvez résoudre ce problème avec un bind
dans votre reliure clic, je ne pense pas que ce soit la meilleure solution.
La liaison click
transmet le modèle cliqué à l'écouteur par défaut . Bind créera une nouvelle fonction pour chaque élément et déplacera la logique vers vos vues.
Voici un exemple:
var data = [
{ Id: 0, Category: "A", Name: "A0" },
{ Id: 1, Category: "B", Name: "B1" },
{ Id: 2, Category: "C", Name: "C2" },
{ Id: 3, Category: "D", Name: "D3" }
];
ko.applyBindings({
data: data,
log: function(item) {
console.log(item);
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<ul data-bind="foreach: data">
<li data-bind="click: $parent.log, text: Name"></li>
</ul>
Créez une fonction onClick
supplémentaire si vous devez extraire des propriétés dans une liste d'arguments:
var data = [
{ Id: 0, Category: "A", Name: "A0" },
{ Id: 1, Category: "B", Name: "B1" },
{ Id: 2, Category: "C", Name: "C2" },
{ Id: 3, Category: "D", Name: "D3" }
];
var log = function(id, cat, name) {
console.log("Item ", id, "was clicked. (name:", name, "category:", cat);
}
ko.applyBindings({
data: data,
onClick: function(item) {
log(item.Id, item.Category, item.Name);
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<ul data-bind="foreach: data">
<li data-bind="click: $parent.onClick, text: Name"></li>
</ul>
Je l'utilise toujours et fonctionne bien.
html:
<input type="button" value="click to test" data-bind="click: $root.getCompleteDetails" />
javascript:
getCompleteDetails: function (item, event) {
// you can access all properties in item parameter
}
J'espère que ça aide.
Pour relier les clics dans une boucle, utilisez this pour obtenir les valeurs d’entrée dans la ligne actuelle.
<tbody data-bind="foreach: DataList">
<tr>
<td><input type="label" data-bind="text: Id"></td>
<td><input type="label" data-bind="text: Category"></td>
<td><input type="label" data-bind="text: Name"></td>
<td><input type="button" data-bind="click: $parent.getCompleteDetails" value="View Details"/></td>
</tr>
</tbody>
Dans le script Knockout, obtenez les entrées de ligne actuelles à l'aide de ce mot clé.
self.DataList =ko.observableArray([]); //this is used to populate the data entries.
self.getCompleteDetails= function() {
alert(this.Id);
alert(this.Category);
alert(this.Name);
}