2014-09-03 1 views
1

У меня есть сетка строки заказа, где я должен иметь возможность открывать форму редактора всплывающих окон программно с полями поля редактирования, предварительно заполненными (используя AngularJs).Как заполнить форму add-row программно для сетки пользовательского интерфейса Kendo (AngularJS)

В HTML, у меня есть lineGrid и AddButton, который вызывает addRow() на ticketEntryController:

<div id="wrapper" class="container-fluid" ng-controller="ticketEntryController"> 
    <div ng-controller="ticketLineController"> 
     <div kendo-grid="ticketLineGrid" k-options="getTicketLineGridOptions()"></div> 
    </div> 
    <button id="addButton" ng-click="addRow()" class="btn btn-primary btn-sm">Add Row</button> 
</div> 

Вот ticketEntryController:

(function() { 
    'use strict'; 
    angular.module('app').controller('ticketEntryController', ticketEntryController); 

    function ticketEntryController($scope) { 
     $scope.lineGrid = {}; 
     $scope.addRow = function() { 
      var item = { itemNo: 'TEST123', itemDescr: 'Some description' }; 
      $scope.$broadcast('AddRow', item); 
     } 
    } 
})(); 

Вот часть ticketLineController :

function ticketLineController($scope) { 
    $scope.$on('AddRow', function(event, item) { 
     console.log("ticketLineController, AddRow: " + item.itemNo); 
     $scope.itemNo = item.itemNo; 
     $scope.itemDescr = item.itemDescr; 
     $scope.ticketLineGrid.addRow(); 
    }); 

Plunker: http://plnkr.co/edit/VG39UlTpyjeTThpTi4Gf?p=preview

При нажатии кнопки «Добавить строку» открывается всплывающая форма редактора, но все поля пустые. Как я могу заполнить поля (например, когда вы нажимаете кнопку «Изменить» для существующей строки)?

+0

Какие значения вы хотите заполнить в новой строке?Не новая строка должна иметь пустые значения, так как она «новая» – JoseM

+0

@JoseM Пользователь сканирует штрих-код или ищет элемент в сетке, а затем выбирает элемент для добавления в заказ. Это должно вызвать всплывающее окно добавления/редактирования, которое представляет собой настраиваемую форму, содержащую несколько полей только для чтения (информация), в которых отображаются описание элемента, производитель, номер производителя, стоимость и т. Д., А также некоторые редактируемые поля, такие как как количество и цена, которые пользователь будет редактировать по мере необходимости, прежде чем добавлять линию в сетку. – Lars335

+0

@JoseM Просто, чтобы уточнить мой последний комментарий: слово «сетка» в «пользователь сканирует штрих-код или ищет элемент в сетке», относится к отдельной сетке поиска элементов. Плункер очень упрощен и не включает эту сетку поиска элементов и т. Д. - он содержит только достаточно, чтобы показать конкретную проблему и, надеюсь, получить ответ. – Lars335

ответ

1

Я понял, как получить ряд быть предварительно заполняется для вас, хотя я не уверен, что это обязательно лучший способ сделать это, но это выполнить работу - я более знакомы с AngularJs, а не с пользовательским интерфейсом Kendo.

Единственное, что Kendo API позволяет вам изменить или установить новый элемент, который вы добавляете, находится в edit event, но я не мог видеть способ отправки вашего собственного объекта вместе с событием, когда вы вызываете addRow так, чтобы вам нужно иметь ссылку на общий объект в контроллере, я позвонил itemForAdd. Перед вызовом addRow() в вашем контроллере вам необходимо установить объект itemForAdd с фактическим объектом, который вы хотите предварительно заполнить форму.

var itemForAdd = {}; 
    $scope.$on('AddRow', function(event, item) { 
     // save reference to item to use for pre-population 
     itemForAdd = item; 
     $scope.ticketLineGrid.addRow(); 
    }); 

Теперь в edit случае, Кендо API посылает, вы можете заполнить элементы из выбранного элемента в элементе модели. Это не обязательно, но мне также нравится очищать объекты, которые я использую так, поэтому в событиях сохранения и отмены я очищаю общий объект itemForAdd.

  edit: function (e) { 
       if (e.model.isNew()) { 
        e.model.set("itemNo", itemForAdd.itemNo); 
        e.model.set("itemDescr", itemForAdd.itemDescr); 
       } 

       var popupWindow = e.container.getKendoWindow(); 
       e.container.find(".k-edit-form-container").width("auto"); 
       popupWindow.setOptions({ 
        width: 640 
       }); 
      }, 
      save: function(e) { 
       if (e.model.isNew()) { 
       // clear out the shared object 
       itemForAdd = {}; 
       } 
      }, 
      cancel: function(e) { 
       if (e.model.isNew()) { 
       // clear out the shared object 
       itemForAdd = {}; 
       } 
      } 

С предыдущими изменениями, функциональные возможности, которые вы хотите в основном работает, но данные в таблице в всплывающем окне редактирования не показывает обновленные значения. Это связано с тем, что привязки данных Kendo, по-видимому, не знали, что они должны обновляться. Я не мог понять, как это сделать, поэтому я просто использовал привязки стиля AngularJs для этой таблицы (где у вас было +=itemNo=+), так что значения в таблице будут обновляться на основе изменений в объекте модели:

   <tbody> 
        <tr> 
         <td>{{dataItem.itemNo}}</td> 
         <td>{{dataItem.itemDescr}}</td> 
         <td>{{dataItem.cat}}</td> 
         <td>{{dataItem.mfg}}</td> 
         <td>{{dataItem.mfgPartNo}}</td> 
        </tr> 
       </tbody> 

Но был еще один вопрос, на данный момент, только itemNo была обновлена, а не itemDescr и это потому, что itemDescr был установлен как editable: false в конфигурации сетки, так что мне пришлось изменил его editable: true

     fields: { 
          id: { type: "string", editable: false }, 
          itemDescr: { type: "string", editable: true }, 
          ... 
         }, 

И, наконец, здесь обновленный плункер с моими изменениями: http://plnkr.co/edit/rWavvMh4dRFAsJjuygQX?p=preview

+0

Спасибо за тонну за это! Отлично работает (и я предпочитаю использовать угловые привязки вместо привязок Telerik)! Кроме того, у меня есть вопрос и в Telerik об этом (я не думал, что получу здесь ответ). Но на них уходит около 72 часов, поэтому я могу не услышать назад до выходных - я отправлю сообщение здесь, если они вернутся с «лучшим» решением. Наконец, у меня нет достаточного количества голосов для голосования, но если я помню, я вернусь и сделаю это, как только мне будут предоставлены такие полномочия ... – Lars335

+0

Я столкнулся с несколькими проблемами с вашим решением, когда я пытался реализовать в моем проекте. Ваше решение отлично работало для ограниченного плунжера здесь, поэтому ваш ответ здесь по-прежнему действителен, но если вы хотите нанести удар по возникающим проблемам: http://stackoverflow.com/questions/25695180/kendo-ui-grid -эмиссионный-сберегательная Новая запись-angularjs – Lars335

Смежные вопросы