Nano Hash - криптовалюты, майнинг, программирование

Получить выбранный объект выпадающего списка кендо

Я использую выпадающий список кендо. В частности, я использую директивы Kendo Angular. В настоящее время у меня есть следующее в моей разметке:

<input id='myDropDownList' kendo-drop-down-list ng-model="selectedSport" k-data-source="sports" k-data-text-field="'name'" />
<button ng-click='send()'>Submit</button>

Мой контроллер имеет следующее:

$scope.selectedSport = null;
$scope.sports: [
  { id: 1, name: 'Basketball' },
  { id: 2, name: 'Football' },
  { id: 3, name: 'Tennis' }
];

$scope.send = function () {
  alert($scope.selectedSport);
};

Когда я запускаю этот код, я получаю идентификатор selectedSport. Однако я хочу весь объект. Каждое другое сообщение StackOverflow, которое я нашел, использует извлечение идентификатора. На всю жизнь я не могу понять, как получить объект. Кто-нибудь знает, как получить выбранный объект JSON вместо идентификатора?

Спасибо!

13.12.2013

Ответы:


1

Этот ответ, вероятно, устарел для текущих версий привязок Kendo Angular. Как упоминалось в ответе hally9k, теперь есть атрибут k-ng-model, который может справиться с этим, поэтому вы должны использовать

k-ng-model="selectedSport"

на месте

ng-model="selectedSport"

Предыдущий ответ ниже; это может быть или не быть актуальным, если вы используете более старую версию пользовательского интерфейса Kendo:

Я не думаю, что вы можете настроить виджет кендо для непосредственного хранения dataItem - под всем этим все еще находится <select> с примитивным значением. Поэтому вам, вероятно, придется получить dataItem из источника данных виджета, например. как это:

HTML:

<div ng-controller="MyController">
    <select id='myDropDownList' kendo-drop-down-list ng-model="selectedSport" k-data-source="sports" k-data-value-field="'id'" k-data-text-field="'name'"></select>
    <button ng-click='send()'>Submit</button>
</div>

JS:

function MyController($scope) {
    $scope.selectedSport = null;
    $scope.sports = new kendo.data.DataSource({
        data: [{
            id: 1,
            name: 'Basketball'
        }, {
            id: 2,
            name: 'Football'
        }, {
            id: 3,
            name: 'Tennis'
        }]
    });

    $scope.send = function () {
        var dataItem = $scope.sports.get($scope.selectedSport);

        console.log(dataItem);
    };
}

Однако вы можете создать свою собственную директиву для kendoDropDownList, которая использует атрибут k-data-item (например), и использовать ее следующим образом:

HTML:

<select id='date' k-ddl k-data-source="sports" k-data-text-field="name" k-data-item="dataItem">

JS:

var app = angular.module('Sample', ['kendo.directives']).directive("kDdl", function () {
    return {
        link: function (scope, element, attrs) {
            $(element).kendoDropDownList({
                dataTextField: attrs.kDataTextField,
                dataValueField: "id",
                dataSource: scope[attrs.kDataSource],
                change: function () {
                    var that = this;
                    var item = that.dataItem();

                    scope.$apply(function () {
                        scope[attrs.kDataItem] = item.toJSON();
                    });
                }
            });
        }
    };
});

function MyController($scope) {
    $scope.sports = [{
        id: 1,
        name: 'Basketball'
    }, {
        id: 2,
        name: 'Football'
    }, {
        id: 3,
        name: 'Tennis'
    }];
    $scope.dataItem = $scope.sports[0];
    $scope.send = function () {
        console.log($scope.dataItem);
    };
}

Таким образом, вы можете сохранить контроллер свободным от кода, специфичного для Kendo UI DataSource, и вместо этого работать только с типами данных JS. (см. JSBin)

14.12.2013
  • Подскажите, пожалуйста, откуда берется метод get на спорт? 16.12.2013
  • Не могли бы вы проверить код на JSBin, потому что текущий пример работает неправильно, возможно, последняя версия из angular-kendo.js была изменена? 10.01.2014
  • @Lars, демо работает нормально, не могли бы вы указать, что вы изменили? И вы также тестировали его с последними угловыми и кендо? 10.01.2014
  • @Stef Я просто исправил ссылку на angular-kendo (которая была сломана) - я не уверен, что angular-kendo совместим с последней версией angular (хотя в этой демонстрации код даже не зависит от angular -кендо, так как это отдельная директива) 10.01.2014

  • 2

    Использование k-ng-model свяжет dataItem, а не только текстовое значение:

    <input id='myDropDownList' kendo-drop-down-list k-ng-model="selectedSport" k-data-source="sports" k-data-text-field="'name'" />
    
    16.05.2015
  • Это должен быть правильный ответ - самый простой и приятный. 28.08.2015
  • На самом деле, если вам все еще нужно привязать идентификатор к переменной модели, вы можете использовать: k-data-value-field='id' k-ng-model=selectedSport ng-model=sportId . Таким образом, у вас есть и то, и другое — вы можете использовать то, что вам нужно. 28.08.2015

  • 3

    Я знаю, что это старый вопрос, но вы можете использовать событие select раскрывающегося списка, чтобы получить базовый объект json:

    select: function (e) {
        var item = this.dataItem(e.item.index());
        ...
    }
    

    Затем вы должны сохранить объект json (переменная элемента выше) из события выбора, чтобы вы могли получить к нему доступ из своего метода отправки. Вероятно, есть способ получить выбранный объект json без использования события выбора.

    16.01.2015

    4

    Правильный способ получить текстовое значение — использовать событие «k-select» выпадающего списка Kendos:

    <select kendo-drop-down-list k-select="vm.test" k-data-text-field="'groupName'" k-data-value-field="'id'" k-data-source="vm.groupList" ng-model="vm.groupId"></select>
    

    Затем в вашем контроллере angular выставьте функцию «тест» (пример предполагает, что вы используете «контроллер как vm»):

    function DocumentTypeController() {
      var vm = this;
      vm.test = test;
      vm.groupId = null;
    
      function test(dropdown) {
        alert('text is:' + dropdown.item.text());
      }
    }
    

    Надеюсь, это поможет.

    27.08.2015
  • На самом деле ответ @Hal 9k намного проще! 28.08.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..