剔除自定义绑定如何与 observableArray 一起使用?当将 ko.observable() 与自定义绑定一起使用时,一切都会按预期工作。当使用 ko.observableArray() 时,仅抛出初始事件(初始化和更新一次),但不会检测到进一步的更改(请参阅Fiddle或下面的代码)。
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="knockout-2.2.1.js"> </script>
</head>
<body>
<div data-bind="text: Observable, updateBinding: Observable"></div>
<div data-bind="foreach: ObservableArray, updateBinding: ObservableArray">
<span data-bind="text: $data"></span>
</div>
<script type="text/javascript">
ko.bindingHandlers['updateBinding'] = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
alert("Binding Handler (Init)");
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
alert("Binding Handler (Update)");
}
};
function ViewModel() {
var self = this;
self.ObservableArray = ko.observableArray();
self.Observable = ko.observable();
}
var viewModel = new ViewModel();
// Fires Init + Update for Observable and ObservableArray
ko.applyBindings(viewModel);
// Fires Update for Observable
viewModel.Observable(1);
// Does nothing
viewModel.ObservableArray.push('1');
</script>
</body>
</html>
您将需要在自定义绑定中创建对 observableArray 的依赖项。所以,至少是这样的:
ko.bindingHandlers.updateBinding = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
alert("Binding Handler (Init)");
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
//create a dependency, normally you would do something with 'data'
var data = ko.utils.unwrapObservable(valueAccessor());
alert("Binding Handler (Update)");
}
};
这适用于您的可观察示例的原因是因为单个元素上的所有绑定都是一起触发的(更多信息here).
这在其他绑定上的行为方式不同的原因是foreach
行为不同。对 observableArray 的更改不会触发foreach
直接绑定(或者整个部分将被重新渲染)。相反,它会触发单独的 ko.compulated 中的逻辑,该逻辑评估数组如何更改并进行必要的增量更新(添加项目、删除项目等)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)