2013-03-25 2 views
0

Я использую Kendo UI Combos и нокаутом. Я пытаюсь каскадировать результаты одного комбо, чтобы фильтровать данные, доступные в другом.Kendo UI Broken Bindings (Cascading Combos - проблемы с параметрами)

Значение dataTextField в родительской комбо не может использоваться как-для фильтрации дочерних комбо данных, поэтому я использую параметр parameterMap для его изменения. К сожалению, это не похоже на работу, и я получаю сообщение об ошибке при связывании ...

Message: SyntaxError: Expected ':'; 

Bindings value: kendoComboBox: 
    {scrollable: 
     { virtual: true } 
    ,filter: 'contains', 
    pageable: true, 
    dataTextField: 'Description', 
    dataValueField: 'Id', 
    autoBind: false, 
    placeholder: 'Select...' , 
    cascadeFrom: 'NotifierServiceType', 
    dataSource: 
     {type : 'odata', 
     serverPaging: true, 
     serverFiltering: true, 
     serverSorting: true, 
     pageSize: 100, 
     filter : {field : 'LookUpType', operator : 'eq', value:15}, 
     transport: {  
       read: {  url: 'http://xxx/INS/services/LookUpService.svc/LookUpItems',  dataType: 'json' } , 
       parameterMap: function(data, type) 
        { return { filter[filters][0][field]: 'ParentId';} 
       } 
      } 
     }, 
    value:notifierSubDivisionId 
    } 

Когда секция parameterMap удаляется он связывается правильно, но ребенок комбо не фильтруется, как и ожидалось.

Любая помощь, которая будет с благодарностью получена.

EDIT:

Вот пересмотренный код, который получает каскадный комбо работы:

parameterMap: function(data, action) { 
    var filterStem; 
    var filter; 
    filterStem = '$inlinecount=allpages&$top=100&$filter=(LookUpType+eq+15'; 
    if (data.filter.filters[1] === undefined){ 
     filter = ')'; } 
    else { 
     filter = '+and+ParentId+eq+' + data.filter.filters[1].value + ')' ; 
    } 
    return filterStem + filter; }}} 

Я уверен, что есть лучший способ изменить фильтр - любые идеи?

Спасибо.

+1

Я еще не использовал параметр parameterMap, но используемый вами синтаксис выглядит как недопустимый JS. Похоже, у вас будут только доступные переменные 'data' и' type'. Вы также не сможете вернуть литерал объекта с динамическим именем свойства. Вам нужно будет создать объект и установить его на объект, а затем вернуть объект. ('var obj = {}; obj [dynamicFieldName] = 'ParentId'; return obj;') –

+0

Спасибо RP, вы правы, синтаксис js неверен. Вот модифицированный код, который успешно реализует Cascading Combos, где имя родителя не совпадает с именем, используемым в группе Parent. parameterMap: function (data, action) { \t var filterStem; \t var filter; \t filterStem = '$ inlinecount = AllPages & $ сверху = 100 & $ = фильтр (LookupType + Eq + 15'; \t, если (data.filter.filters [1] === не определено) { \t \t фильтр = ')' ; } \t else { \t \t фильтр = '+ и + ParentId + eq +' + data.filter.filters [1] .value + ')'; \t} \t фильтр возвратаStem + фильтр; }}} – user2208192

+0

@ user2208192 - Пожалуйста, не оставляйте комментарии в комментариях, их очень трудно прочитать. Пожалуйста, опубликуйте изменение в вопросе, еще лучше, разместите демо в [jsfiddle] (http://jsfiddle.net) –

ответ

0

Вы можете попробовать kendoUI + jaydata для oData, это выигрышная комбинация. (отказ от ответственности: я работаю для JayData). У нас есть демо о каскадной комбо здесь: http://jaydata.org/examples/KendoUI/cascadingcombobox.html Для простой каскадной комбо вам понадобятся только несколько строк пользовательского кода javascript.

$data.initService(url) 
.then(function (remoteDB) { 
    $("#categories").kendoComboBox({ 
     placeholder: "Select category...", 
     dataTextField: "Category_Name", 
     dataValueField: "Category_ID", 
     dataSource: remoteDB.Categories.asKendoDataSource() 
    }); 

    var products = $("#products").kendoComboBox({ 
     autoBind: false, 
     cascadeFrom: "categories", 
     placeholder: "Select product...", 
     dataTextField: "Product_Name", 
     dataValueField: "Product_ID", 
     dataSource: remoteDB.Products.asKendoDataSource() 
    }).data("kendoComboBox"); 
}); 
+0

Спасибо за предложение, но я не вижу, как этот подход помогает мне «переключать» идентификатор поля, который используется для фильтрации одаты? Я что-то упустил? – user2208192

+0

вы можете легко переключить поле, что-то вроде этого (это не специфический jaydata, а источник данных kendoui, но с jaydata вам не нужно ничего делать) var datasource = remoteDB.Categories.asKendoDatasource(); ... используйте его с виджетами кендо ... ... затем позже ... datasource.filter ({поле: «Цена», оператор: «lt», значение: 3}); ... или ... datasource.filter ({поле: «Имя», оператор: «eq», значение: 'blah'}); –

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