2013-07-24 45 views
7

Podążam za artykułem Using Kendo UI with MVC4 WebAPI OData and EF. Po zainstalowaniu KendoUI i upewniając się, że wszystkie odniesienia są ustawione, wpisuję w trzech znaków, i pojawia się następujący błąd:Błąd renderowania danych z autouzupełnianiem JavaScript/KendoUI - Obiekt nr <Object> nie ma metody "plaster" - jak rozwiązać?

Uncaught TypeError: Object # has no method 'slice'

źródła problemu

Aby zapisać poprzez czytanie aktualizacji: Poprzez debugowania odkrył, że problem polega na tym, że JS spodziewa się przeanalizować tablicę, której nie ma w danych - w katalogu głównym. W hierarchii danych, jest to jeden poziom w

Original Problem

ja oczyścić kendo.web.min.js a błąd jest występujących wokół linii 3498.

success: function (n) { 
    var i = this, 
     r = i.options; 
    return i.trigger(wt, { 
     response: n, 
     type: "read" 
    }), n = i.reader.parse(n), i._handleCustomErrors(n) ? (i._dequeueRequest(), t) : (i._pristine = et(n) ? e.extend(!0, {}, n) : n.slice ? n.slice(0) : n, i._total = i.reader.total(n), i._aggregate && r.serverAggregates && (i._aggregateResult = i.reader.aggregates(n)), n = i._readData(n), i._pristineData = n.slice(0), i._data = i._observe(n), i._addRange(i._data), i._process(i._data), i._dequeueRequest(), t) 

Kendo UI widgety ładujesz dobrze jak również CSS:

<link href="~/Content/kendo/kendo.common.min.css" rel="stylesheet" /> 
<link href="~/Content/kendo/kendo.default.min.css" rel="stylesheet" /> 
<script src="~/Scripts/jquery-1.9.1.min.js"></script> 
<script src="~/Scripts/kendo/kendo.web.min.js"></script> 
<script src="~/Scripts/kendo/kendo.aspnetmvc.min.js"></script> 
<script src="~/Scripts/appScripts.js"></script> 

I widzę ten sam błąd zarówno z użyciem maszynki MVC pomocnika/extensio n:

@(Html.Kendo().AutoComplete() 
    .Name("userAutoComplete")     // specifies the "id" attribute of the widget 
    .DataTextField("USERNAME") 
    .DataSource(source => 
     { 
      source.Read(read => 
       { 
        read.Url("/api/user"); 
       }) 
        .ServerFiltering(true);  // if true, the DataSource will not filter the data on the client 
     } 
    ) 
) 

i poprzez bezpośrednio przez JS:

/// <reference path="kendo/kendo.aspnetmvc.min.js" /> 
/// <reference path="kendo/kendo.core.min.js" /> 
/// <reference path="kendo/kendo.autocomplete.min.js" /> 
/// <reference path="kendo/kendo.web.min.js" /> 

$(document).ready(function() { 
    // load up KendoUI 

    // gets data from /api/user 
    var dataSource = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "/api/user" 
      } 
     } 
    }); 

    $("#userSearch").kendoAutoComplete({ 
     dataSource: dataSource, 
     dataTextField: "USERNAME", 
     minLength: 3 
    }); 

    $("#userSearch").on('input', function() { 
     console.log($("#userSearch").val()); 
    }); 

}); // $(document).ready() 

Jestem pewien, że to coś prostego, że może brakować. Próbowałem zarówno z sieci i wszystkich plików js.

Każda pomoc zostanie doceniona.

- AKTUALIZACJA -

Jedynym html brakuje tych treści jest <input id="userAutoComplete" />

I stworzył zupełnie nowe rozwiązanie i bardzo prosty pogląd, oparty na jednym z przykładów Kendo UI która pobiera dane JSON z http://api.geonames.org i otrzymuje ten sam błąd.

Myślałem, że przy użyciu najnowszej biblioteki JS (//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js może być przyczyną problemu więc próbowałem 1,7 lib sam problem.

@using Kendo.Mvc.UI 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Index</title> 

    <link rel="stylesheet" href="@Url.Content("~/Content/kendo.common.min.css")"> 
    <link rel="stylesheet" href="@Url.Content("~/Content/kendo.default.min.css")"> 
    <link rel="stylesheet" href="@Url.Content("~/Content/kendo.dataviz.min.css")"> 

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script> 

    <script src="@Url.Content("~/Scripts/kendo.web.min.js")"></script> 
    <script src="@Url.Content("~/Scripts/kendo.aspnetmvc.min.js")"></script> 
    <script src="@Url.Content("~/Scripts/kendo.dataviz.min.js")"></script> 

    <script type="text/javascript"> 

     $(document).ready(function() { 
      $("#autoComplete").kendoAutoComplete({ 
       minLength: 6, 
       dataTextField: "title", 
       filter: "contains", 
       dataSource: new kendo.data.DataSource({ 
        transport: { 
         read: { 
          url: "http://api.geonames.org/wikipediaSearchJSON", 
          data: { 
           q: function() { 
            return $("#autoComplete").data("kendoAutoComplete").value(); 
           }, 
           maxRows: 10, 
           username: "demo" 
          } 
         } 
        }, 
        schema: { 
         data: "geonames" 
        } 
       }), 
       change: function() { 
        this.dataSource.read(); 
       } 
      }) 
     }); 

    </script>  


</head> 
<body> 
    <div> 

     <input id="autoComplete"/> 

    </div> 
</body> 
</html> 

- AKTUALIZACJA -

Używanie kodu powyżej, wróciłem i wypróbowałem to ponownie - działało dobrze.Po próbach kilka razy, doświadczyłem tego samego problemu.To było ze względu na ważne dane JSON zmienia się na następujące:

{"status":{"message":"the daily limit of 30000 credits for demo has been exceeded. Please use an application specific account. Do not use the demo account for your application.","value":18}} 

... który doprowadzi mnie patrzeć na formatowanie danych pochodzących z moim API (patrząc na nią w Skrzypek:

Zamiast:

JSON --- {... danych. ..

to

JSON 
---$id=1 
---$values 
------{} 
---------$id=2 
---------CREATEDATETIME... 
[email protected] 
---------GROUPS 
------------$id=... 
------------$id=... 
---------USERNAME=someusername 
------{} 
---------$id=4 
. 
. 
. 

więc błąd jest spowodowany tablicy nie jest dostępny gdzie to oczekiwano - zamiast korzenia, to jeden poziom głębokości.

Jak uzyskać powiązanie danych z głębokością jednego poziomu, a nie z głównym obiektem JSON?

Dzięki.

+0

możesz również zamieścić swoje HTML? Czy element #userSearch to ? – AntouanK

Odpowiedz

3

Rozwiązaniem tego problemu było przejście przez hierarchię danych poprzez opisanie formatu wyniku.

Ponieważ tablica jest zawarta w $ wartości, kiedyś definicję następujące źródła danych/schematu:

// gets data from /api/user 
    var dataSource = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "/api/user" 
      } 
     }, 
     schema: {        // describe the result format 
      data: function(data) {    // the data which the data source will be bound to is in the values field 
       console.log(data.$values); 
       return data.$values; 
      } 
     } 
    }); 

Jedną rzeczą, która byłaby miła jest, aby móc dodać typ schematu danych w pomocnika Razor - który jest doesn't seem to be supported at this time.

Zatem dodaje nadal nie będzie działać:

@(Html.Kendo().AutoComplete() 
     .Name("userAutoComplete")     // specifies the "id" attribute of the widget 
     .Filter("startswith") 
     .Placeholder("Type user name...") 
     .DataTextField("USERNAME") 
     .DataSource(source => 
      { 
       source: 
        source.Read(read => 
         { 
          read.Url("/api/user"); 
         }) 
         .ServerFiltering(true);  // if true, the DataSource will not filter the data on the client 

      } 
     ) 
) 
2

Ten pracował dla mnie:

var dataSource = new kendo.data.DataSource({ 
     transport: { 
      read: 
      { 
       url: "api/dashboard" 
      } 
     }, 
     schema: { 
      **data: function (data) 
      { 
       return [data]; 
      }** 
     } 
    }); 

Moja reakcja nie była tablicą, wracałem z serwera obiektem odpowiedzi jak to:

{"Field1":0,"Field2":0,"Field3":0} 
28

Miałem ten sam błąd z ComboBox, którego używałem jako autouzupełniania. W moim kontroler, instrukcja return był

return Json(model.ToDataSourceResult(dataSourceRequest), JsonRequestBehavior.AllowGet) 

którą zmieniono na

return Json(model, JsonRequestBehavior.AllowGet) 

To dało tablicę na poziomie korzeni zamiast jednego poziomu głębokiego dla mnie.

+1

W moim przypadku używam OData i zaimplementowałem to tak: http://www.whatsinyourlunch.com/odata-kendo-ui-entity-framework-webapi/ - więc typem zwrotnym jest IEnumerable lub IQueryable. – ElHaix

0

dziękuję "brittongr" ... to działało również dla mnie. ale w moim przypadku nie jest to właściwe, budowałem wykres, wykres potrzebował oczywiście tablicy, więc zamiast zmieniać schemat, konwertując moje dane Json do tablicy właśnie wróciłem z mojej akcji z listy zawierającej jeden element. Coś podobnego poniżej.

Random rand = new Random(); 

int numIterations = 0; 

numIterations = rand.Next(1, 1200); 

List aux = new List&lt;graphicDataItem&gt;(); 

aux.Add(new graphicDataItem { ColumnTotal = 1200, ColumnActives = numIterations, ColumnInactives = 1200 - numIterations, ColumnApprovedByMembers = 250, ColumnApprovedByAssoc = 300, XAxisData = DateTime.Now.Year }); 

return Json(aux, JsonRequestBehavior.AllowGet); 

mam „graphicDataItem” typ zdefiniowany w moim katalogu podmiotów, ale jest łatwo dostać patrząc na sposób, w jaki jest tworzony w kodzie.

0

mogę zmienić tego, a to praca dla mnie:

@(Html.Kendo().AutoComplete() 
.Name("productAutoComplete") //The name of the autocomplete is mandatory. It specifies the "id" attribute of the widget. 
    .DataTextField("myfield") //Specifies which property of the Product to be used by the autocomplete. 
.DataSource(source => 
{ 
    source.Custom() 
    .Type("aspnetmvc-ajax") 
    .Transport(transport=> 
    { 
     transport.Read("MyAction", "Control"); 
    }) 
    .Schema(schema=>schema.Data("Data").Total("Total")) 

    .ServerFiltering(true); //If true the DataSource will not filter the data on the client. 
}) 

)