如何将自定义绑定与ko.obsobservaleArray()一起使用



敲除自定义绑定如何使用observableArray?当使用带有自定义绑定的ko.observable()时,一切都能按预期进行。当使用ko.obstrableArray()时,只抛出初始事件(init和update一次),但不会检测到进一步的更改(请参阅下面的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)");
        }
    };

这适用于您的可观察示例的原因是,单个元素上的所有绑定都是一起触发的(此处提供更多信息)。

这在另一个绑定上的行为不同的原因是foreach的行为不同。对observableArray的更改不会直接触发foreach绑定(或者整个部分将被重新渲染)。相反,它在一个单独的ko.computed中触发逻辑,评估数组的变化情况,并进行必要的增量更新(添加项目、删除项目等)

最新更新