Knockout.js la saisie semi-automatique bindingHandler

Je tente ma main à un gestionnaire pour la saisie semi-automatique Knockout.js et je suis à la recherche de quelques commentaires. Actuellement, cela fonctionne, mais je vais essayer de voir si je peux faire le travail sans trop de Eval()dans tous les sens, et par souci de réutilisabilité, voir si il y a un moyen de faire référence à la ViewModel sans présupposer elle est nommée " vm " comme ci-dessous.

Utilisation:

<input placeholder="Test..." type="search" data-bind="autoComplete:$root.persons, source:'/api/Person/', parameterName:'searchString', labelKey:'displayName', valueKey:'urid', onSelected:'addPerson'" autocomplete="off" />

JS:

ko.bindingHandlers.autoComplete = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var postUrl = allBindingsAccessor().source; //url to post to is read here
        var param = allBindingsAccessor().parameterName;
        var labelKeyName = allBindingsAccessor().labelKey;
        var valueKeyName = allBindingsAccessor().valueKey;
        var selectedFunction = allBindingsAccessor().onSelected;
        var selectedObservableArrayInViewModel = valueAccessor();

        $(element).autocomplete({
            minLength: 2,
            autoFocus: true,
            source: function (request, response) {
                $.ajax({
                    url: param != null ? postUrl : postUrl + request.term,
                    data: param == null ? '' : param + "=" + request.term,
                    dataType: "json",
                    type: "GET",
                    success: function (data) {
                        response($.map
                            (data, function (obj) {
                                return {
                                    label: eval("obj." + labelKeyName),
                                    value: eval("obj." + valueKeyName)
                                };
                            }));
                    }
                });
            },
            select: function (event, ui) {
                if (selectedFunction != null) {
                    var functionCall = 'vm.' + selectedFunction + "(event, ui)";
                    eval(functionCall);
                }
            }
        });
    }
};
Vous savez que vous n'avez pas eval() d'accéder à une propriété, par son nom, ne obj[propertyName] et vous l'avez...

OriginalL'auteur Mike Thibault | 2013-04-07