如何停止按字母顺序排序Kendo UI下拉列表

时间:2016-06-15 16:51:25

标签: kendo-ui

我接受了有趣的工作,接受别人的代码并试图弄明白......

我一直在试图弄清楚如何阻止Kendo UI下拉按字母顺序排序?

<select id="ddlArtworkStatuses" onlyPreparedValues="true"          
readOnlyInput="true" data-bind="idNameOptions: artworkStatuses,  
comboboxSelectedValue: artworkStatusId"></select>

出于某种原因,这可以按照惯例进行排序,但我希望它能保持数据源中的顺序。我已仔细检查以确保它符合我想要的顺序。

它没有使用Kendo UI的标准方式,我找不到任何以这种方式使用它的例子?

它将视图绑定到模型,我认为该视图位于顶部?

<!-- ko with: fabricationModel -->

vm.fabrication文件是这样的:

(function (app) {
    app.namespace("models");

    var resources = {
        unableToDeleteArtworkMessage: "This artwork cannot be deleted because it is linked to one or more of the following: Movements, Shows, POs. Or it has Imported Costs, Sales or Restoration Cases.",
        unableToBlankArtworkFullyMessage: "This artwork has some data that will not be blanked if you continue. This could be one or more of the following: Movements, Shows, POs, Imported Costs, Sales or Restoration Cases. Do you want to continue?",
        deleteArtworkTitle: "Delete artwork",
        blankArtworkTitle: "Blank Artwork",
        duplicateTitle: "New artwork form is pre-populated",
        duplicateMessage: "You can make changes to Fabrication form fields. Record will be created after you press save button",
        saveError: 'An error occured during artwork saving. Changes were not saved.'
    };

    app.models.FabricationModel = function (datasource) {
        var emitter = new app.events.EventEmitter(),
            self = this,
            duplicateArtwork = ko.observable(false);

        this.isNewArtwork = ko.observable(false);
        this.isActivated = ko.observable(false);
        this.showCreationInformation = ko.observable(true);

        this.wipeArtworkModel = new app.models.WipeArtworkDialogModel(datasource);
        this.internalArtworkModel = ko.observable();
        this.editCategoryModel = new app.models.EditDhCategoryModel();

      //  alert("data=" + this.artworkStatuses);

        this.isReadOnly = ko.computed(function () {
            if (!self.internalArtworkModel()) {
                return true;
            }

            return self.internalArtworkModel().isReadOnly();
        });

        this.canSaveStudioStatusOnly = ko.computed(function () {
            if (!self.internalArtworkModel()) {
                return false;
            }

            return self.internalArtworkModel().isUnblockStatusActive()
                   && self.internalArtworkModel().isReadOnly()
                   && self.internalArtworkModel().isStudioStatusVisible();
        });

        this.canSaveCatRaisOnly = ko.computed(function () {
            if (!self.internalArtworkModel()) {
                return false;
            }

            return self.internalArtworkModel().isReadOnly()
                   && self.internalArtworkModel().isArchiveProvenanceWriter();
        });

        this.isNewOrDuplicating = ko.computed(function () {
            return self.isNewArtwork() || duplicateArtwork();
        });

        this.activate = function (params) {
            var id = params.id || 0;
            self.isNewArtwork(!id);

            return self.loadArtworkDetails(id);
        };

        this.isValid = function () {
            return self.internalArtworkModel() && self.internalArtworkModel().errors().length == 0;
        };



        this.loadArtworkDetails = function (id) {
            var action = self.isNewArtwork() ? datasource.artworks.getEmpty : datasource.artworks.getById;
            return action(id)
                .done(function (result) {
                    var mapper = app.mappers["fabrication"],
                        model = mapper.map(result.data);

                    self.internalArtworkModel(model);
                    self.editCategoryModel.categoryId(model.defaultDhCategoryId);
                    self.editCategoryModel.setModeAsCategoryChanging();
                    if (self.isNewArtwork()) {
                        self.editCategoryModel.setModeAsCreation();
                        self.editCategoryModel.show();
                    }

                    self.isActivated(true);
                    duplicateArtwork(false);

                    $("a#science-link").attr("href", window.location.href);
                    triggerLoadEvent();
                });
        };

        this.saveArtwork = function () {
            if (self.isValid()) {
                return saveInternal($.noop);
            }
        };

        this.editCategory = function () {
            self.editCategoryModel.show();
        };

        this.onLoad = function (callback) {
            emitter.subscribe("load", callback);
        };

        this.onCategoryChanged = function (callback) {
            emitter.subscribe("category-changed", callback);
        };

        this.onDelete = function (callback) {
            emitter.subscribe("delete", callback);
        };

        this.onCreated = function (callback) {
            emitter.subscribe("artwork-created", callback);
        };

        this.onUpdated = function (callback) {
            emitter.subscribe("artwork-updated", callback);
        };

        this.onBlanked = function (callback) {
            emitter.subscribe("blanked", callback);
        };

        this.saveStudioStatusInt = function () {
            return saveStudioStatusInternal($.noop);
        };

        this.saveCatRaisInt = function () {
            return saveCatRaisInternal($.noop);
        };

        this.saveStudioStatus = ko.asyncCommand({
            execute: function (complete) {
                saveStudioStatusInternal(complete);
            },

            canExecute: function (isExecuting) {
                return !isExecuting && self.canSaveStudioStatusOnly();
            }
        });

        this.saveCatRais = ko.asyncCommand({
            execute: function (complete) {
                saveCatRaisInternal(complete);
            },

            canExecute: function (isExecuting) {
                return !isExecuting && self.canSaveCatRaisOnly();
            }
        });

        this.save = ko.asyncCommand({
            execute: function (complete) {
                return saveInternal(complete);
            },

            canExecute: function (isExecuting) {
                if (!self.isValid()) {
                    showErrors();
                }

                return !isExecuting && self.isValid();
            }
        });

        function saveStudioStatusInternal(completeCallback) {
            var model = self.internalArtworkModel();
            triggerSaveStudioStatusEvent();
            datasource.artworks.saveStudioStatus(model.artworkId(), model.artworkStatusId(), model.studioStatusId).always(completeCallback);
        }

        function saveCatRaisInternal(completeCallback) {
            var model = self.internalArtworkModel();
            triggerSaveStudioStatusEvent();
            datasource.artworks.saveCatRais(model.artworkId(), model.inclusion(), model.image(), model.details(), model.crReady(), model.selectedVolume.selected.value).always(completeCallback);
        }

        this.onSaveStudioStatus = function (callback) {
            emitter.subscribe("saveStudioStatus", callback);
        };

        function triggerSaveStudioStatusEvent() {
            emitter.publish("saveStudioStatus");
        }


        this.beginArtworkDeletion = function () {
            if (!self.internalArtworkModel().canBeBlanked) {
                jAlert(resources.unableToDeleteArtworkMessage, resources.deleteArtworkTitle);
                return;
            }

            self.wipeArtworkModel.beginArtworkDeletion(self.internalArtworkModel().artworkId());
        };

        this.beginArtworkBlanking = function () {
            if (!self.internalArtworkModel().canBeBlanked) {
                //jAlert(resources.unableToBlankArtworkMessage, resources.blankArtworkTitle);
                app.alerts.appConfirm(resources.unableToBlankArtworkFullyMessage, resources.blankArtworkTitle, function (ok) {
                    if (ok) {
                        self.wipeArtworkModel.beginArtworkBlanking(self.internalArtworkModel().artworkId());
                    }
                });
                return;
            }

            self.wipeArtworkModel.beginArtworkBlanking(self.internalArtworkModel().artworkId());
        };

        this.duplicateArtwork = function () {
            if (!self.internalArtworkModel()) {
                return;
            }

            duplicateArtwork(true);
            resetModelBeforeDuplication();
            if (self.isValid()) {
                showErrors();
            }
            jAlert(resources.duplicateMessage, resources.duplicateTitle);
        };

        function saveInternal(completeCallback) {
            var mapper = app.mappers["fabrication"];

            //alert("saving now...");

            var unmappedModel = mapper.toJS(self.internalArtworkModel());
            if (duplicateArtwork()) {
                return saveDuplicatedArtwork(unmappedModel, completeCallback);
            }

            if (unmappedModel.artworkId) {
                return updateArtwork(unmappedModel, completeCallback);
            }

            return createArtwork(unmappedModel, completeCallback);
        }

        function saveDuplicatedArtwork(model, completeCallback) {
            return datasource.artworks.duplicate(model)
                .always(completeCallback)
                .fail(function (response) {
                    jAlert(resources.saveError);
                })
                .done(function (id) {
                    triggerArtworkCreatedEvent(id);
                    duplicateArtwork(false);
                    self.showCreationInformation(true);
                });
        }

        function updateArtwork(model, completeCallback) {
            return datasource.artworks.save(model)
                .always(completeCallback)
                .fail(function (response) {
                    jAlert(resources.saveError);
                })
                .done(function (result) {
                    if (!result) {
                        return;
                    }
                    var mapper = app.mappers["fabrication"],
                        mappedModel = mapper.map(result.data);

                    triggerUpdateEvent(
                        {
                            dhCategory: mappedModel.dhCategory(),
                            refNumber: mappedModel.refNumber(),
                            computedTitle: mappedModel.computedTitle()
                        });

                    self.internalArtworkModel(mappedModel);
                });
        }

        function createArtwork(model, completeCallback) {
            return datasource.artworks.save(model)
                .always(completeCallback)
                .fail(function (response) {
                    jAlert(resources.saveError);
                })
                .done(function (id) {
                    if (id) {
                        triggerArtworkCreatedEvent(id);
                    }
                });
        }

        function triggerLoadEvent() {
            var model = self.internalArtworkModel();
            emitter.publish("load", {
                artworkId: model.artworkId() || 0,
                dhCategory: model.dhCategory() || "",
                refNumber: model.refNumber() || "",
                computedTitle: model.computedTitle() || "",
                isForSale: model.isForSale
            });
        }

        function triggerArtworkCreatedEvent(artworkId) {
            emitter.publish("artwork-created", artworkId);
        }

        function triggerCategoryChangedEvent() {
            emitter.publish("category-changed", {
                name: self.internalArtworkModel().dhCategoryName(),
                id: self.internalArtworkModel().dhCategoryId()
            });
        }

        function triggerDeleteEvent(e, artworkId) {
            emitter.publish("delete", artworkId);
        }

        function triggerUpdateEvent(data) {
            var model = self.internalArtworkModel();
            data.isCategoryChanged = model.initialCategoryId !== model.dhCategoryId();

            emitter.publish("artwork-updated", data);
        }

        function showErrors() {
            var model = self.internalArtworkModel();
            if (model) {
                model.errors.showAllMessages();
            }
        }

        function resetModelBeforeDuplication() {
            var model = self.internalArtworkModel();

            model.refNumber("");
            model.computedTitle("");

            model.isOnDisplay(false);
            model.isOnRestoration(false);
            model.salesStatus("Not set");

            model.creationDate("");
            model.creatorName("");

            model.isFramed(false);
            model.framedDate("");
            model.framedUserName("");
            model.framedUserInitials("");
            model.framedUserId(null);

            model.locations(null);
            model.isInsuranceComponent(false);

            model.dateWebsiteWork("");
            model.dateWebsiteReady("");
            model.dateWebsiteUploaded("");
            model.dateRemovedFromWebsite("");
            model.collectionListing("");
            model.salesStatusChangedDate("");
            model.salesStatusChangerUserInitials("");
            model.salesStatusChangerUserName("");

            self.showCreationInformation(false);
        }

        function triggerBlanked(artworkId) {
            emitter.publish("blanked", { artworkId: artworkId, flag: true });
        }

        (function () {
            self.editCategoryModel.onChanged(function (e, categoryId) {
                self.internalArtworkModel().dhCategoryId(categoryId);
                triggerCategoryChangedEvent();
            });

            self.editCategoryModel.onCancel(function () {
                if (self.isNewArtwork()) {
                    self.isNewArtwork(false);
                    app.router.back();
                }
            });

            self.wipeArtworkModel.onDelete(triggerDeleteEvent);
            self.wipeArtworkModel.onBlank(function (e, artworkId) {
                self.loadArtworkDetails(artworkId);
                triggerBlanked(artworkId);
            });
        })();
    };
})(app);

它还使用了映射器:

(function (app, ko) {
    app.namespace("mappers");
    var s = app.urls.shared,
        datasource = app.datasource;

    var mapSettings = {
        selectedMedium: {
            create: function (options) {
                return new ListModel({
                    isRemoteSource: true,
                    url: s.get('dictionaryUrl'),
                    listType: datasource.dictionaryTypes.get("medium"),
                    currentValue: options.data,
                    nobutton: true,
                    templateName: "textAreaTemplate"
                });
            }
        },

        artist: {
            create: function (options) {
                return new ListModel({
                    isRemoteSource: true,
                    url: s.get('dictionaryUrl'),
                    listType: datasource.dictionaryTypes.get("artist"),
                    currentValue: options.data,
                    onlyPreparedValues: false
                });
            }
        },

        manager: {
            create: function (options) {
                return new ListModel({
                    isRemoteSource: true,
                    url: s.get('dictionaryUrl'),
                    listType: datasource.dictionaryTypes.get("manager"),
                    currentValue: options.data,
                    onlyPreparedValues: false
                });
            }
        },

        managerStatus: {
            create: function (options) {
                return new ListModel({
                    isRemoteSource: true,
                    url: s.get('dictionaryUrl'),
                    listType: datasource.dictionaryTypes.get("managerStatus"),
                    currentValue: options.data,
                    onlyPreparedValues: false
                });
            }
        },

        selectedVolume: {
            create: function (options) {
                return new ListModel({
                    isRemoteSource: true,
                    url: s.get('dictionaryUrl'),
                    listType: datasource.dictionaryTypes.get("volume"),
                    currentValue: options.data,
                    onlyPreparedValues: false,
                    readonly: !options.parent.isArchiveProvenanceWriter(),
                    editable: options.parent.isArchiveProvenanceWriter()
                });
            }
        },

        salesStatus: {
            create: function (options) {
                var value = options.data || "Not set";
                return ko.observable(value);
            }
        },

        oldReferences: {
            create: function (options) {
                return ko.observable(options.data);
            }
        },

        copy: ['defaultDhCategoryId', "canBeDeleted", "canBeBlanked", "isForSale"],

        ignore: ["dimensions", "dimensionUnits", "selectedMediumTypes", "selectedSeries", "selectedSubSeries", "selectedAkaNames", "selectedWebSiteMediumTypes", 'selectedWebSiteCategoryIds', "locations", "hasInTransitLocations"]
    },
        unmapSettings = {
            ignore: ["selectedMedium", "artist", "manager", "managerStatus", "mediumTypesModel", "dimensionModel", "seriesModel", "subSeriesModel", "akaModel", "webSiteMediumTypesModel", "webSiteCategoriesModel", "selectedVolume"]
        },

        map = function (json) {
            var convertedObject = ko.utils.parseJson(json);

            var model = ko.mapping.fromJS(convertedObject, mapSettings);

            model.artworkStatusesModel = new ListModel({
                isRemoteSource: false,
                currentValue: convertedObject.selectedArtworkStatus,
                data: convertedObject.artworkStatuses,
                //data: filteredSalesStatuses,
                onlyPreparedValues: true,
                allowNull: false,
                readonly: true
            });


            alert("mooo=" + model.artworkStatuses()[0].name());
            alert("mooo=" + model.artworkStatuses()[1].name());
            alert("mooo=" + model.artworkStatuses()[2].name());
            //alert("mooo=" + model.artworkStatuses()[3].name());
            //alert("mooo=" + model.artworkStatuses()[4].name());

            model.dhCategoryName = ko.computed(function () {
                var categories = model.dhCategories();
                for (var i = 0; i < categories.length; i++) {
                    var category = categories[i];
                    if (category.id() == model.dhCategoryId()) {
                        return category.name();
                    }
                }

                return "";
            });

            model.initialCategoryId = convertedObject.dhCategoryId;
            model.dimensionModel = new app.models.DimensionModel(convertedObject.dimensions);
            ko.utils.arrayForEach(convertedObject.dimensionUnits, function (unit) {
                model.dimensionModel.units.push(unit);
            });
            model.locations = ko.observable(convertedObject.locations ? {
                archivedLocations: $.map(convertedObject.locations, function (elem) {
                    return elem.isArchived ? elem : null;
                }),
                activeLocations: $.map(convertedObject.locations, function (elem) {
                    return elem.isArchived ? null : elem;
                }),
                hasInTransitLocations: convertedObject.hasInTransitLocations
            } : convertedObject.locations);
            model.mediumTypesModel = new app.models.MultilistModel(convertedObject.selectedMediumTypes, { url: s.get("mediumTypesUrl") });
            model.seriesModel = new app.models.MultilistModel(convertedObject.selectedSeries, { url: s.get("seriesUrl") });
            model.subSeriesModel = new app.models.MultilistModel(convertedObject.selectedSubSeries, { url: s.get("subSeriesUrl") });
            model.akaModel = new app.models.MultilistModel(convertedObject.selectedAkaNames, { url: s.get("akaUrl") });

            model.webSiteMediumTypesModel = new app.models.MultilistModel(convertedObject.selectedWebSiteMediumTypes, { url: s.get("webSiteMediumTypeUrl") });
            model.webSiteCategoriesModel = new app.models.MultilistModel(convertedObject.selectedWebSiteCategories, { url: s.get("webSiteCategoryUrl") });
            model.isStudioStatusVisible = ko.computed(function () {
                var foundStatuses = ko.utils.arrayFilter(model.artworkStatuses(), function (status) {
                    return status.id() == model.artworkStatusId();
                });

                var currentStatus = foundStatuses[0];
                if (currentStatus) {
                    return currentStatus.name().toLowerCase() == "in progress";
                }

                return false;
            });


            addValidationOptions(model);

            return model;
        },

        toJS = function (artwork) {
            var result = ko.mapping.toJS(artwork, unmapSettings);

            result.artist = artwork.artist.toJS();
            result.manager = artwork.manager.toJS();
            result.managerStatus = artwork.managerStatus.toJS();
            result.selectedMedium = artwork.selectedMedium.toJS();
            result.selectedVolume = artwork.selectedVolume.toJS();

            result.dimensions = artwork.dimensionModel.toJS();

            result.selectedMediumTypes = artwork.mediumTypesModel.toJS();
            result.selectedSeries = artwork.seriesModel.toJS();
            result.selectedSubSeries = artwork.subSeriesModel.toJS();
            result.selectedAkaNames = artwork.akaModel.toJS();

            result.selectedWebSiteMediumTypes = artwork.webSiteMediumTypesModel.toJS();
            result.selectedWebSiteCategories = artwork.webSiteCategoriesModel.toJS();

            return result;
        };

    function isValidationRequired(model) {
        var artworkStatus = ko.utils.unwrapObservable(model.artworkStatusId);
        var dhCategory = ko.utils.unwrapObservable(model.dhCategoryId);
        return artworkStatus == app.global.dictionary.get("compiteArtworkStatus")
            && dhCategory != app.global.dictionary.get("ignoreDHCatigory");
    }

    function addValidationOptions(model) {
        model.artworkStatusId.extend({ required: true });
        model.title.extend({ required: true });
        model.artist.selected.value.extend({ required: true });

        model.startYear.extend({
            lessEqualThan: {
                params: model.endYear,
                onlyIf: function () {
                    return (model.endYear() != undefined && model.endYear() != null);
                },
                message: 'From Date should be less or equal than a To Date'
            }
        });

        model.endYear.extend({
            required: {
                params: true,
                onlyIf: function () {
                    return isValidationRequired(model);
                },
                message: "To Date field is required"
            }
        });

        model.selectedMedium.selected.value.extend({
            required: {
                params: true,
                onlyIf: function () {
                    return isValidationRequired(model);
                },
                message: "Medium is required"
            }
        });

        model.mediumTypesModel.hasValue.extend({
            equal: {
                params: true,
                onlyIf: function () {
                    return isValidationRequired(model);
                },
                message: "Medium Type is required"
            }
        });

        model.akaModel.hasValue.extend({
            equal: {
                params: true,
                onlyIf: function () {
                    return isValidationRequired(model);
                },
                message: "Aka is required"
            }
        });

        model.isInsuranceComponent.extend({
            equal: {
                params: true,
                onlyIf: function () {
                    return isValidationRequired(model);
                },
                message: "At least 1 Insurance component should be chosen"
            }
        });

        model.dimensionModel.hasDimensions.extend({
            equal: {
                params: true,
                onlyIf: function () {
                    return isValidationRequired(model);
                },
                message: "The Dimension fields should be filled"
            }
        });

        model.errors = ko.validation.group(model, { deep: true });
    }

    app.mappers.fabrication = {
        settings: mapSettings,
        map: map,
        toJS: toJS
    };
})(app, ko);

我收到提醒的时候,这些项目的顺序是正确的,所以它们正在某个地方进行排序,但无法找到位置?!

我希望有人可以提供帮助吗?

非常感谢。

非常感谢, 大卫。

0 个答案:

没有答案