我将我的ViewModel的isChecked
属性绑定到data-whatever
属性。此属性的值由jQuery的改变:KnockoutJs不会对自定义事件做出反应
$element.data('whatever', "true")
KnockoutJs没有注意到这个变化,我的ViewModel的属性不会改变。我如何让KnockoutJs注意到它?
我想类似的东西,但它没有工作:
JavaScript的 “视图层” 的剧本:
$element.data('whatever', "true")
$element.trigger("myCustomEvent")
的观点:
<div data-bind="attr: { 'data-whatever': isChecked, event : {myCustomEvent: checkedFunction} }">
checkedFunction
只是一个空方法在ViewModel中适合事件绑定语法。它仍然看起来像KnockoutJs不听myCustomEvent
。
编辑
由于渔人建议我用$element.attr
代替$element.data
,但它仍然不能正常工作:
<html>
<div id="test" data-bind="attr: { 'data-whatever': isChecked }">my div</div>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="http://knockoutjs.com/downloads/knockout-3.2.0.js"></script>
<script>
var vm = {
isChecked : ko.observable("one"),
};
$(function() {
ko.applyBindings(vm);
console.log($('#test').attr('data-whatever')); // "one"
$('#test').attr('data-whatever', 'two');
console.log($('#test').attr('data-whatever')); // "two"
console.log(vm.isChecked()); // // "one" again, thouh it should be "two"
});
</script>
</html>
即使我添加事件:
<html>
<div id="test" data-bind="attr: { 'data-whatever': isChecked, event :{ myCustomEvent : aFunction }}">my div</div>
<script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="http://knockoutjs.com/downloads/knockout-3.2.0.js"></script>
<script>
var vm = {
isChecked : ko.observable("one"),
aFunction : function(){ }
};
vm.isChecked.subscribe(function(){
console.log("hit the event"); // never happens
});
$(function() {
ko.applyBindings(vm);
console.log($('#test').attr('data-whatever')); // "one"
$('#test').attr('data-whatever', 'two');
$('#test').trigger('myCustomEvent');
console.log($('#test').attr('data-whatever')); // "two"
console.log(vm.isChecked()); // "one" again, though should be "two"
});
</script>
</html>
你能编辑的问题,并创建一个[摄制](http://sscce.org)?这会帮助你更轻松。 – Jeroen 2014-10-01 12:34:15
KO使用jQuery(如果可用)绑定到事件。这里是你可以调整的示例:http://jsfiddle.net/rniemeyer/Lf53moaa/ – 2014-10-01 13:37:39
@Jeroen添加了repro。请看一下。 – gisek 2014-10-01 16:43:15