Knockout js table 行点击打断单选按钮点击绑定
Knockout js table row click breaks radio button click binding
我正在努力解决这个问题。我有一个 table,其中有许多行绑定到 knockout
中的视图模型。
想法是可以select编辑一行。有一个单选按钮指示 selection。但是,在这种情况下,当我单击该行时,单选按钮变为 selected - 正如我所希望的那样。但是,当单击单选按钮时,它不会 select 本身。
这是使用 table 行点击绑定实现的。
<tr data-bind="click: $parent.doSelect.bind($parent, $data);">
这会导致无线电 selection 出现问题。您可以看到绑定值已设置,但由于某些原因,单选按钮 selection 不会更改。
怎样才能让selection的两种方式都玩得很好?
这是一个fiddle
html
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
<table>
<thead>
<th>Select</th>
<th>Col A</th>
<th>Col B</th>
</thead>
<tbody>
<!-- ko foreach: { data: items, as: 'item' } -->
<tr data-bind="click: $parent.doSelect.bind($parent, $data);">
<td>
<input type="radio" name="selectMe" data-bind="checkedValue: Id(), checked: $parent.selectedItemId" />
</td>
<td data-bind="text: Name"></td>
</tr>
<!-- /ko -->
</tbody>
</table>
<p>
You have selected <span data-bind="text: selectedItemId"></span>
</p>
javascript
function MyViewModel() {
this.selectedItemId = ko.observable(null);
this.items = ko.observable([{
Id: ko.observable(1),
Name: ko.observable("Dave")
},
{
Id: ko.observable(2),
Name: ko.observable("Bob")
},
]);
this.selectedItemId.subscribe(function(itemId) {
console.log("selectedItemId.subscribe: fired for " + itemId);
var self = this;
_.forEach(this.items(), function(item) {
if (itemId == item.Id()) {
// need to set something here
}
});
}, this);
}
MyViewModel.prototype.doSelect = function(item) {
var itemId = ko.unwrap(item.Id);
console.log("doSelect: " + itemId);
this.selectedItemId(itemId);
};
ko.applyBindings(new MyViewModel());
在函数doSelect
中必须returntrue
否则事件不会冒泡。
MyViewModel.prototype.doSelect = function(item) {
var itemId = ko.unwrap(item.Id);
this.selectedItemId(itemId);
return true;
};
参见 KO documentation。
However, if you do want to let the default click action proceed, just return true from your click handler function.
我正在努力解决这个问题。我有一个 table,其中有许多行绑定到 knockout
中的视图模型。
想法是可以select编辑一行。有一个单选按钮指示 selection。但是,在这种情况下,当我单击该行时,单选按钮变为 selected - 正如我所希望的那样。但是,当单击单选按钮时,它不会 select 本身。
这是使用 table 行点击绑定实现的。
<tr data-bind="click: $parent.doSelect.bind($parent, $data);">
这会导致无线电 selection 出现问题。您可以看到绑定值已设置,但由于某些原因,单选按钮 selection 不会更改。
怎样才能让selection的两种方式都玩得很好?
这是一个fiddle
html
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>
<table>
<thead>
<th>Select</th>
<th>Col A</th>
<th>Col B</th>
</thead>
<tbody>
<!-- ko foreach: { data: items, as: 'item' } -->
<tr data-bind="click: $parent.doSelect.bind($parent, $data);">
<td>
<input type="radio" name="selectMe" data-bind="checkedValue: Id(), checked: $parent.selectedItemId" />
</td>
<td data-bind="text: Name"></td>
</tr>
<!-- /ko -->
</tbody>
</table>
<p>
You have selected <span data-bind="text: selectedItemId"></span>
</p>
javascript
function MyViewModel() {
this.selectedItemId = ko.observable(null);
this.items = ko.observable([{
Id: ko.observable(1),
Name: ko.observable("Dave")
},
{
Id: ko.observable(2),
Name: ko.observable("Bob")
},
]);
this.selectedItemId.subscribe(function(itemId) {
console.log("selectedItemId.subscribe: fired for " + itemId);
var self = this;
_.forEach(this.items(), function(item) {
if (itemId == item.Id()) {
// need to set something here
}
});
}, this);
}
MyViewModel.prototype.doSelect = function(item) {
var itemId = ko.unwrap(item.Id);
console.log("doSelect: " + itemId);
this.selectedItemId(itemId);
};
ko.applyBindings(new MyViewModel());
在函数doSelect
中必须returntrue
否则事件不会冒泡。
MyViewModel.prototype.doSelect = function(item) {
var itemId = ko.unwrap(item.Id);
this.selectedItemId(itemId);
return true;
};
参见 KO documentation。
However, if you do want to let the default click action proceed, just return true from your click handler function.