Цикл for в шаблоне Kendo Grid

У меня большие проблемы с Kendo Grid.

Если я использую цикл for в качестве клиентского шаблона, как этот

col.Bound(m => m.Compteurs)
    .ClientTemplate("# for (var i=0;i<4;i++) { console.log(i) } #");

я никогда не увеличивается. То же самое с циклом while и увеличением внутри цикла.

как решить это?

Спасибо

РЕДАКТИРОВАТЬ - Полное объявление сетки:

@(Html.Kendo().Grid<EAGLE.Models.ParamUf>()
.Name("ParamGrid")
.Columns(col =>
    {
        col.Bound(m => m.Groupement);
        col.Bound(m => m.Etablissement).ClientTemplate("#= Etablissement.EtablissementName #");
        col.Bound(m => m.Service).ClientTemplate("#= Service.ServiceName #");
        col.Bound(m => m.Discipline).ClientTemplate("#= Discipline.DisciplineName #");
        col.Bound(m => m.Unite).ClientTemplate("#= Unite.UniteName #");
        col.Bound(m => m).ClientTemplate(Html.Partial("_Tel").ToHtmlString());
        col.Bound(m => m.Unite.TypeHebergement).Title("Hébergement");
        col.Bound(m => m.Installe);
        col.Bound(m => m.Ferme);
        col.Bound(m => m.Compteurs).ClientTemplate("# for (var i=0;i<4;i++) { console.log(i) } #");        
        col.Command(commands =>
        {
            commands.Edit().UpdateText("Mettre à jour").CancelText("Annuler").Text("Edit");
            commands.Destroy().Text("Suppr.");
        }).Title(string.Empty).Width(160);

    }
)
.DataSource(data => data
                .Ajax()
                .Read(read => read.Action("Param_Read", "Param", new { entityCode = @ViewBag.Code, entityType = @ViewBag.Type }).Data("filterUnit"))
                    .Model(m => 
                    {
                        m.Id(a => a.Unite.UniteCode);
                        m.Field(a => a.Etablissement).DefaultValue(new EAGLE.Models.Etablissement());
                        m.Field(a => a.Service).DefaultValue(new EAGLE.Models.Service());
                        m.Field(a => a.Discipline).DefaultValue(new EAGLE.Models.Discipline());
                        m.Field(a => a.Unite).DefaultValue(new EAGLE.Models.Unite());
                    }) 
                .Create(cre => cre.Action("Param_Create", "Param"))
                .Update(upd => upd.Action("Param_Update", "Param"))
                .Destroy(des => des.Action("Param_Destroy", "Param"))
                .Batch(false)
                .ServerOperation(false))
.Pageable(pager => pager
    .Enabled(false)        
    .Messages(m => m.Display("Nombre total d'hébergement : {2}"))
    .Messages(m => m.Empty("Pas d'hébergement."))
    .PreviousNext(false)
    .Input(false)
    .Numeric(false))   
.ToolBar(toolbar => { toolbar.Create(); })
.Editable(ed => ed.Mode(GridEditMode.PopUp).TemplateName("_ParamEdit"))
.Events(e => e.DataBound("onDatabound"))
)

person User.Anonymous    schedule 29.07.2013    source источник
comment
Вы когда-нибудь решали это? У меня есть полностью противоположная проблема, когда счетчик не останавливает увеличение (даже с жестко закодированным числом меньше, чем у вас здесь), и это приведет к сбою вкладки. В синтаксисе JavaScript нет ничего плохого, так как он отлично работает в инструментах разработки.   -  person pwdst    schedule 07.07.2014
comment
Да, мы обнаружили, что сгенерированный код удаляет ++ . Публикую ответ ниже.   -  person User.Anonymous    schedule 08.07.2014


Ответы (3)


Для следующих, у которых есть эта проблема, вы можете решить ее по-другому.

1-й способ (сложный): добавить функцию javascript increment

function increment(a) 
{
   return a++;
}

И использовать его в шаблоне

col.Bound(m => m.Compteurs)
    .ClientTemplate("# for (var i=0;i<4;increment(i)) { console.log(i) } #");

2-й способ по коду С# (включите это между col.Bound):

    int i = 0;
    foreach (EAGLE.Models.Compteur c in ViewBag.Compteurs)
    {
        col.Bound(m => m.Compteurs[i].Dispo).Title(c.NomCourt)
            .HtmlAttributes(new { style = String.Format("background-color:\\#{0}", c.Color), @class = "compteur" })
            .HeaderTemplate("<img class='iconeHeader' src='data:image/png;base64," + c.Picto + "' title='"+ c.Nom +"' />");
        i++;
    }

3-й способ (ответ Матфея):

 var template = "# for (var i=0;i<4;i++) { console.log(i) } #";
 var plusEncoded= System.Web.HttpUtility.UrlEncode("+"); 
 template = Regex.Replace(template, @"[+]", plusEncoded);
 col.Bound(m => m.Compteurs).ClientTemplate(template);
person User.Anonymous    schedule 08.07.2014
comment
return ++a было бы лучше, в вашем примере это не имеет большого значения, но все же... - person Robert; 30.03.2015
comment
Вы можете поместить весь цикл for в функцию javascript. Это было бы намного чище. - person ataravati; 13.07.2015
comment
третий способ не работает. Однако это так: var template = # for (var i=0;i‹4;i++) { console.log(i) } #; var plusEncoded= System.Web.HttpUtility.UrlEncode(+); template = Regex.Replace(template, @[+], plusEncoded); ... col.Bound(m => m.Compteurs).ClientTemplate(template); - person Matthew; 20.08.2015
comment
Я обновил ответ вашим фрагментом. Спасибо. - person User.Anonymous; 21.08.2015

Кажется, + или ++ удаляются при использовании в частичных представлениях с элементами управления кендо. Есть еще один обходной путь для этой проблемы:

col.Bound(m => m.Compteurs)
    .ClientTemplate("# for (var i = 4; i > 0; i--) { console.log(i) } #");

надеюсь это поможет

person marko Jovanovic    schedule 31.05.2018
comment
Это помогает мне, так как у меня было частичное представление, и я не знал, почему цикл не работает, пока не получил этот ответ. Вы спасли мой день! Спасибо, приятель. - person Altaf Patel; 28.01.2020

Это должно было сработать. По крайней мере, эта версия JavaScript работает:

$("#grid").kendoGrid({
  dataSource: [
    { name: "John" },
    { name: "Jane" }
  ],
  columns: [
    { field: "name" },
    { field: "name", 
     template: "# for (var i=0;i<4;i++) { console.log(i) } #" 
    }
  ]
});

Может быть, ваша сетка не связана с ajax? Отображение полной конфигурации подтвердит или опровергнет это.

person Atanas Korchev    schedule 31.07.2013
comment
Сетка связана ajax с объектом DataSource. Другие столбцы хорошо работают с ClientTemplate или ClientTemplate + Partial View. Я использую Kendo MVC Component для .Net, чтобы сгенерировать это. - person User.Anonymous; 02.08.2013