2015-09-10 2 views
2

У меня есть кендо сетки, и если выбран элемент я хочу изменить основную DataItem так я делаю это ...Как предотвратить повторную попытку изменения элемента данных сетки кендо?

selectionChange: function(e) 
    { 
     var component = $(this.table).closest('.component'); 
     var grid = this; 
     var val = !component.hasClass("secondary"); 

     var selection = grid.dataItems(grid.select()); 
     selection.forEach(function() { 
      this.set("SaleSelected", val); 
     }); 
    } 

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

select: function (e) { 
      e.preventDefault(); 
      var sender = this; 

      // get kendo data source for the primary grid 
      var source = $(sender).closest(".component") 
       .find(".component.primary") 
       .find(".details > [data-role=grid]") 
       .data("kendoGrid") 
       .dataSource; 

      // sync and reload the primary grid 
      source.sync() 
       .done(function() { 
        source.read(); 
        my.Invoice.reloadGridData($(sender).closest(".component").find(".component.secondary").find(".details > [data-role=grid]")); 
       }); 

      return false; 
     }, 
     deselect: function (e) { 
      e.preventDefault(); 
      var sender = this; 
      debugger; 
      // get kendo data source for the secondary grid 
      var source = $(sender).closest(".component") 
       .find(".component.secondary") 
       .find(".details > [data-role=grid]") 
       .data("kendoGrid") 
       .dataSource; 

      // sync and reload the primary grid 
      source.sync() 
       .done(function() { 
        source.read(); 
        my.Invoice.reloadGridData($(sender).closest(".component").find(".component.primary").find(".details > [data-role=grid]")); 
       }); 

      return false; 
     } 

по существу «выбранные элементы» из СЕТКА1 могут быть помечены как таковые на сервере, то сетки перезагружаются в течение перемещения элементов.

Все хорошее, что я думал, но, видимо, у Кендо есть другие идеи.

Редактирование элемента данных приводит к тому, что его собственная сетка восстанавливает потерю состояния выбора, приводя к некоторому запутанному поведению для пользователя.

Есть ли способ сказать кендо «Я собираюсь отредактировать это несвязанное свойство прямо сейчас, не переходите к связыванию»?

ответ

1

Хорошо получается, kendo - это немного вирдо, и я до сих пор не знаю, почему они настаивают на том, что вы называете все свои «вещи api», чтобы выполнять простые задачи, когда дела более прямо работают на самом деле.

В моем случае я вообще удалил вызов смены выбора и дал возможность управлять кендо, а затем в обработчиках кнопок выбора для перемещения данных между сетками я обновил свойства непосредственно на элементах данных, а не вызывал «item.set («prop», value) «Мне теперь нужно сделать« item.prop = value ».

Конечным результатом является то это ...

select: function (e) { 
      e.preventDefault(); 
      var sender = this; 

      // get some useful bits 
      var component = $(sender).closest(".component"); 
      var primaryGrid = component.find(".component.primary").find(".details > [data-role=grid]").data("kendoGrid"); 

      // get the new selection, and mark the items with val 
      var selection = $(primaryGrid.tbody).find('tr.k-state-selected'); 

      selection.each(function (i, row) { 
       primaryGrid.dataItem(row).SaleSelected = true; 
       primaryGrid.dataItem(row).dirty = true; 
      }); 

      // sync and reload the primary grid 
      primaryGrid.dataSource.sync() 
       .done(function() { 
        primaryGrid.dataSource.read(); 
        component.find(".component.secondary") 
         .find(".details > [data-role=grid]") 
         .data("kendoGrid") 
         .dataSource 
         .read(); 
       }); 

      return false; 
     }, 
     deselect: function (e) { 
      e.preventDefault(); 
      var sender = this; 

      // get some useful bits 
      var component = $(sender).closest(".component"); 
      var secondaryGrid = component.find(".component.secondary").find(".details > [data-role=grid]").data("kendoGrid"); 

      // get the new selection, and mark the items with val 
      var selection = $(secondaryGrid.tbody).find('tr.k-state-selected'); 

      selection.each(function (i, row) { 
       secondaryGrid.dataItem(row).SaleSelected = false; 
       secondaryGrid.dataItem(row).dirty = true; 
      }); 

      // sync and reload the primary grid 
      secondaryGrid.dataSource.sync() 
       .done(function() { 
        secondaryGrid.dataSource.read(); 
        component.find(".component.primary") 
         .find(".details > [data-role=grid]") 
         .data("kendoGrid") 
         .dataSource 
         .read(); 
       }); 

      return false; 
     } 

кендо, как представляется, принимать любой вызов item.set (р, v) в качестве триггера для перезагрузки данных таким образом, избегая кендо обертку и собирается непосредственно свойства элемента позволяют мне прямо контролировать процесс.

Перемещение кода из обработчика события изменения выбора в обработчик нажатия кнопки также означает, что я только забочусь о том, что данные правильные, когда на самом деле нужно отправить сервер, что я просто должен знать.

Мне это не нравится, но он достаточно чист, и ui показывает правильную картинку, даже если базовые данные не совсем правильные.

Моим другим вариантом было бы создать пользовательскую привязку, но при условии, что привязка приведет к различным результатам в зависимости от погоды, которая была обязательной для первичной или вторичной сетки. Я подозреваю, что будет много js-кода, это похоже на меньшее из двух зол.

+0

почему они настаивают на том, что вы называете все свои «вещи api», чтобы выполнять простые задачи, когда делаете что-то более прямое на самом деле работает лучше - Вы прибиваете его.Это грязный маленький секрет большинства фреймворков, они все о каком-то разработчике, который считает, что лучше знает, и зарабатывать деньги. Многие из них на самом деле не спасают вас в любое время. – Gerry

0

Я думаю, вы можете связать событие DataBinding к просто «preventDefault», а затем отвязать его и обновить на досуге

var g = $("#myGrid").data("kendoGrid"); 

g.bind("dataBinding", function(e) { e.preventDefault(); }); 

потом ...

g.unbind("dataBinding"); 
+0

Единственная проблема заключается в том, что я не хочу привязываться к следующему изменению выбора, поэтому его не так, как я могу удалить привязку, внести изменения, а затем снова добавить их. Я не уверен, как реализовать это как решение. – War

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