Используя knockoutJS, как создать список с множественным выбором - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь использовать функциональность списка выбора jQuery при использовании KnockoutJS, но не могу заставить его работать.

Используя пользовательские привязки, мне удалось преобразовать ul элемент по выбору и создание обработчиков событий для выбранных и невыбранных событий.Но что я передаю своим функциям ViewModel, которые поддерживают выбранные элементы?

Вот мой код: http://jsfiddle.net/QCmJt/

Я новичок во всем этом, так что, возможно, я подхожу к этомунеправильный путь ...

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Вот немного изменённого из твоего, тоже получилось. Он использует выбранное свойство для каждого элемента в массиве, которое можно наблюдать для двухсторонней связи. Если вам нужно свойство, представляющее собой просто список выбранных элементов, вы всегда можете создать зависимую наблюдаемую область или просто метод для фильтрации.

http://jsfiddle.net/QCmJt/32/

Создана пользовательская привязка:

ko.bindingHandlers.selectableItem = {
    init: function(element, valueAccessor, allBindingsAccessor) {
        var selectable = $(element).parent();

        selectable.bind('selectableselected', function(event, ui) {
            if(ui.selected === element) {                
                var value = valueAccessor();

                value(true);
            }
        });

        selectable.bind('selectableunselected', function(event, ui) {
            if(ui.unselected === element) {                
                var value = valueAccessor();

                value(false);                
            }
        });
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var el = $(element);

        if(valueAccessor()()) {
            el.addClass('ui-selected');
        } else {
            el.removeClass('ui-selected');
        }
    }
};

Он не защищен для более чем простых двусторонних привязок, но должен быть достаточно легким для наращивания.

0 голосов
/ 02 ноября 2011

Хорошо, я придумала способ передачи данных, связанных с выбранным элементом:

$(ui.selected).tmplItem().data при выборе и $(ui.selected).tmplItem().data при отмене выбора.

Вот обновленная скрипка: http://jsfiddle.net/8RnxC/

Пользовательская привязка выглядит так:

ko.bindingHandlers.selectable = {
        init: function(element, valueAccessor) {
            $(element).attr("id", "selectable").selectable({
                selected: function(event, ui) {
                    vm.selectRequest($(ui.selected).tmplItem().data);
                },
                unselected: function(event, ui) {
                    vm.unselectRequest($(ui.unselected).tmplItem().data);
                }
            });
        }
    };

А на мой взгляд модель:

function viewModel() {
        // Data
        this.requests = ko.observableArray([]);
        this.selectedRequests = ko.observableArray([]);

        // Behaviours
        this.selectRequest = function(request) {
            this.name = "othername";
            // Add to array if not already there.
            if ($.inArray(request, this.selectedRequests()) === -1) {
                this.selectedRequests().push(request);
            }
            var self = this;

        };
        this.unselectRequest = function(request) {
            // Remove from the array.
            this.selectedRequests().splice($.inArray(request, this.selectedRequests()), 1);
        };
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...