2017-12-17 8 views
1

Wenn ich folgendes ObjektAngular 2 Kendo toOdataString zurückkehr leere Zeichenfolge

{ 
    "logic":"and", 
    "filters":[ 
     { 
     "logic":"or", 
     "filters":[ 
      { 
       "field":"text", 
       "operator":"neq", 
       "value":"" 
      } 
     ] 
     }, 
     { 
     "logic":"or", 
     "filters":[ 
      { 
       "field":"userActivityVetSpecializations.vetSpecializationId", 
       "operator":"neq", 
       "value":"-1" 
      } 
     ] 
     } 
    ] 
} 

zum Kendō Winkelfunktion toODataString Pass erhalten I eine eine leere Zeichenfolge Antwort.

Irgendwelche Vorschläge auf Kendo, um die richtig formatierte Odata-Zeichenfolge zurückzugeben?

Antwort

0

Es scheint, dass der alte kendo JavaScript-Kerncode dies richtig gehandhabt hat, also habe ich es in Typoskript konvertiert.

toODataFilter(filter) { 
var result = [], 
    logic = filter.logic || "and", 
    idx, 
    length, 
    field, 
    type, 
    format, 
    operator, 
    value, 
    ignoreCase, 
    filters = filter.filters; 

for (idx = 0, length = filters.length; idx < length; idx++) { 
    filter = filters[idx]; 
    field = filter.field; 
    value = filter.value; 
    operator = filter.operator; 

    if (filter.filters) { 
    filter = this.toODataFilter(filter); 
    } else { 
    ignoreCase = filter.ignoreCase; 
    field = field.replace(/\./g, "/"); 
    filter = this.odataFilters[operator]; 


    if (operator === "isnull" || operator === "isnotnull") { 
     filter = this.String.format("{0} {1} null", field, filter); 
    } else if (operator === "isempty" || operator === "isnotempty") { 
     filter = this.String.format("{0} {1} ''", field, filter); 
    } else if (filter && value !== undefined) { 
     type = typeof value; 
     if (type === "string") { 
     format = "'{1}'"; 
     value = value.replace(/'/g, "''"); 

     if (ignoreCase === true) { 
      field = "tolower(" + field + ")"; 
     } 

     } else if (type === "date") { 
      format = "{1:yyyy-MM-ddTHH:mm:ss+00:00}"; 
     // TODO **** Time zone 
     //value = kendo.timezone.apply(value, 'Etc/UTC'); 

     } else { 
     format = "{1}"; 
     } 

     if (filter.length > 3) { 
     if (filter !== "substringof") { 
      format = "{0}({2}," + format + ")"; 
     } else { 
      format = "{0}(" + format + ",{2})"; 
      if (operator === "doesnotcontain") {   
       format = "{0}({2},'{1}') eq -1"; 
       filter = "indexof";    
      } 
     } 
     } else { 
     format = "{2} {0} " + format; 
     } 

     filter = this.String.format(format, filter, value, field); 
    } 
    } 

    result.push(filter); 
} 

filter = result.join(" " + logic + " "); 

if (result.length > 1) { 
    filter = "(" + filter + ")"; 
} 

return filter; 

}

Objekte

odataFilters = { 
eq: "eq", 
neq: "ne", 
gt: "gt", 
gte: "ge", 
lt: "lt", 
lte: "le", 
contains: "contains", 
doesnotcontain: "substringof", 
endswith: "endswith", 
startswith: "startswith", 
isnull: "eq", 
isnotnull: "ne", 
isempty: "eq", 
isnotempty: "ne"}; 

String: any = {}; 

Setzen Sie dieses in Konstruktor

 this.String.format = function (format) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    return format.replace(/{(\d+)}/g, function (match, number) { 
     return typeof args[number] != 'undefined' 
     ? args[number] 
     : match 
     ; 
    }); 
    }; 

Dieser Code scheint für mich zu arbeiten, in Ordnung. Es gibt einen Datumsfall, den ich nicht brauchte, also habe ich es auskommentiert.