Хобрук: Ваш путь к мастерству в программировании

Программный выбор строки в сетке Кендо AngularJS

Может ли кто-нибудь помочь мне в программном выборе строки сетки кендо в angular. Я могу выбрать строку по номеру строки. Я не могу найти способ выбрать строку на основе содержимого ее столбца.

HTML:

 <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    <div kendo-grid="myGrid" k-options="myOptions"  k-selectable="'row'" k-on-change="myGridChange()"></div> 
  </body>

JS:

var app = angular.module('plunker', ['kendo.directives']);

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';

  $scope.myOptions = {
    columns:[
      {
        field: 'ID'
      },
      {
        field: 'FirstName'
      },
      {
        field: 'LastName'
      },
      ],
      dataSource: [
            {ID:139, FirstName:'John', LastName:'Doe'},
            {ID:250, FirstName:'Jane', LastName:'Smith'},
            {ID:376, FirstName:'Henry', LastName:'Rocks'}
            ],
      dataBound:function(e) {
              var grid = e.sender;
              grid.select("tr:eq(2)");
              grid.select("tr[FirstName='Henry'])");  // This doesn't work
      }
  };

  $scope.myGridChange = function(){
     var selectedRows = $scope.myGrid.select();             // This doesn't work
     console.log($scope.myGrid.dataItem(selectedRows[0]));
  };


});

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

Вот мой плункер http://plnkr.co/edit/PpDuSR10xNOxOVirDpfN?p=preview

28.03.2014

Ответы:


1

Измените свой dataBound на это, это ищет всю строку для этого поискового запроса:

  dataBound:function(e) {
        var searchTerm = "Henry";
        var grid = e.sender;  
        grid.select("tr:contains('" + searchTerm + "')");
  }

Или для поиска только по одному столбцу сделайте следующее:

  dataBound:function(e) {
    var grid = e.sender;
    $.each(grid.tbody.find('tr'),function(){
      var model = grid.dataItem(this);
      if(model.FirstName=="Henry"){
        grid.select(this);
      }                          
    });
  }

Что касается вашей ошибки консоли, добавьте id="grid" в свою сетку на странице индекса и замените свой myGridChange на это:

$scope.myGridChange = function(){
    var grid = $scope.myGrid;
    if(!grid)
      grid = $("#grid").data("kendoGrid");
    var selectedRows = grid.select(); 
    var data = grid.dataItem(selectedRows[0]);
    console.log("The name is " + data.FirstName + ", "+ data.FirstName + " " + data.LastName);
};

Вы получали ошибку консоли, потому что сетка не была прикреплена к $scope в команде выбора в функции привязки данных, в результате чего ссылка на сетку была нулевой. Я не очень разбираюсь в angular JS, но выше я применил хакерское решение, назначив сетку и идентификатор, а затем получив сетку из этого селектора идентификатора.

28.03.2014
  • Спасибо, а есть ли способ сделать поиск только по одному столбцу? Если я выполню поиск, как вы предложили, я могу получить строки с совпадением текста в непреднамеренных столбцах. А также значения, которые не совсем совпадают с моим поисковым запросом (например, Генри-младший, Генри-старший) и т. д. 28.03.2014
  • Функция Gridchange работает хорошо, когда я выбираю строку вручную, но если строка выбирается программно, как указано выше, я получаю сообщение об ошибке на консоли. Невозможно выбрать из неопределенного 28.03.2014
  • @Young.Programmer, посмотрите, решит ли мой обновленный ответ ваши проблемы. 29.03.2014
  • Я хочу сделать это угловатым способом и не хочу использовать jQuery. Моя сетка статична после загрузки (без сортировки, фильтрации и т. д.). Итак, единственный способ, которым я могу думать об этом прямо сейчас, - это проверить мой источник данных, получить индекс строки и, наконец, выбрать. Я хотел бы знать, есть ли эффективный/лучший способ сделать это. 29.03.2014
  • @ Young.Programmer Я понимаю, что вы хотите придерживаться углового способа ведения дел, поэтому я постараюсь найти правильный способ сделать это. А пока можно использовать то, что работает. Даже если вы не используете селекторы, на самом деле вы уже используете jQuery, потому что сам angular использует jQuery. Я обновлю, если найду лучший способ. 29.03.2014
  • Что мне делать, предварительно выбрав несколько строк? 29.09.2014

  • 2

    Вы должны основывать свой «tr» на id/uid. если вы проверите элемент, он сообщит вам, какой атрибут у вас есть в этой строке таблицы.

                    dataBound:function(e) { 
                      var grid = e.sender;
                      var data = grid._data; //this is your array of data. make sure you check what's in your object array. log it to see.
    
                      data.forEach(function(entry) { 
                         if($scope.name === entry.name){ 
                            grid.select('tr[data-uid="' + entry.uid + '"]');  
                         }  
                      })
                    },
    
    27.08.2014

    3

    та же проблема: вызов $scope.myGrid.select(someRow) не работает. Код не генерирует исключение, а просто игнорирует вызов.

    Чтобы заставить его работать, я поместил его в setTimeout:

    setTimeout(function () {
      $scope.grid.select(someRow);
    });
    

    Это не элегантно, но работает без лишнего LoC. Я надеюсь, что Telerik исправит это в будущем выпуске.

    13.10.2015

    4

    Программист

    В используемой вами версии кендо это вероятно невозможно. Используя последнюю версию, вы можете сделать это:

    Чтобы улучшить myGridChange():

    1. изменить

    k-on-change="myGridChange()"
    

    to

    k-on-change="myGridChange( dataItem )"
    

    2. изменить

    $scope.myGridChange = function(){
      // some code
    }
    

    to

    $scope.myGridChange = function( dataItem ){
      // dataItem will contain the row that was selected
    }
    

    В основном вы должны сохранить выбранную строку где-нибудь в вашей модели/контроллере.

    Чтобы программно выбрать строку

    $scope.myGrid.select(); // this will not work. 
    

    Это смешивание кода Kendo с AngularJs. Иногда нам приходится это делать, но давайте по возможности избегать этого.

    Быстрый ответ: нет никакого способа сделать это. Что вам нужно сделать, это:

    1. Добавьте стиль CSS в строку.
    2. Измените свою модель, чтобы запомнить, какая строка была выбрана программно.

    Длинный ответ здесь на моей веб-странице . Да, я прошел через ту же боль, что и ты.

    30.09.2014
    Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..