2015-06-25 7 views
1

Я загрузил страницу с ошибкой. Он отображается в консоли (используйте F12 в Firefox или Chrome Browser). http://preventdefault.lima-city.de/index.phpТипError: сетка не определена

Эта линия является неправильным: "kendo.stringify (сетка .getOptions())"

Мой вопрос: Как я должен изменить этот код, чтобы я мог сохранить измененную таблицу настройки?

Я также вставляю здесь код html, Thx для ответа!

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">  
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> 
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1411/styles/kendo.common.min.css"> 
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1411/styles/kendo.rtl.min.css"> 
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1411/styles/kendo.default.min.css"> 
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1411/styles/kendo.dataviz.min.css"> 
    <link rel="stylesheet" href="http://cdn.kendostatic.com/2014.3.1411/styles/kendo.dataviz.default.min.css"> 

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.min.js"></script>  
    <script src="http://cdn.kendostatic.com/2014.3.1411/js/jszip.min.js"></script> 
    <script src="http://cdn.kendostatic.com/2014.3.1411/js/kendo.all.min.js"></script> 

    <style type="text/css"> 
     .button-center { 
      text-align: center; /* button position in grid */ 
     } 
    </style> 
</head> 

<body role="document"> 

    <nav class="navbar navbar-default"> 
     <div class="container-fluid"> 
      <div class="navbar-header"> 
       <a class="navbar-brand" href="#">WebSiteName</a> 
      </div> 
      <div> 
       <ul class="nav navbar-nav"> 
        <li class="active"><a href="index.php">one</a></li> 
        <li><a href="next.php">two</a></li> 
       </ul> 
      </div> 
     </div> 
    </nav> 

    <div class="container theme-showcase" id="main" role="main"> 

     <div class="container"> 
      <h1>Page<small> one</small></h1> 
     </div> 

     <div class="row-fluid"> 
      <div id="grid_one"></div> 
     </div> <!-- row --> 

     <div class="row-fluid"> 
      <div id="log"></div> 
     </div> <!-- row --> 

    </div> <!-- container --> 
<script> 
<!-- --------------------------------------------------------------------------------- --> 
var firstNames = ["Nancy", "Andrew", "Janet", "Margaret", "Steven", 
        "Michael", "Robert", "Laura", "Anne", "Nige"], 
    lastNames = ["Davolio", "Fuller", "Leverling", "Peacock", "Buchanan", 
       "Suyama", "King", "Callahan", "Dodsworth", "White"], 
    cities = ["Seattle", "Tacoma", "Kirkland", "Redmond", "London", 
       "Philadelphia", "New York", "Seattle", "London", "Boston"], 
    titles = ["Accountant", "Vice President, Sales", "Sales Representative", 
       "Technical Support", "Sales Manager", "Web Designer", 
       "Software Developer", "Inside Sales Coordinator", "Chief Techical Officer", 
       "Chief Execute Officer"], 
    birthDates = [new Date("1948/12/08"), new Date("1952/02/19"), new Date("1963/08/30"), 
        new Date("1937/09/19"), new Date("1955/03/04"), new Date("1963/07/02"), 
        new Date("1960/05/29"), new Date("1958/01/09"), new Date("1966/01/27"), 
        new Date("1966/03/27")]; 

function createRandomData(count) { 
    var data = [], now = new Date(); 

    for (var i = 0; i < count; i++) { 
     var firstName = firstNames[Math.floor(Math.random() * firstNames.length)], 
      lastName = lastNames[Math.floor(Math.random() * lastNames.length)], 
      city = cities[Math.floor(Math.random() * cities.length)], 
      title = titles[Math.floor(Math.random() * titles.length)], 
      birthDate = birthDates[Math.floor(Math.random() * birthDates.length)], 
      age = now.getFullYear() - birthDate.getFullYear(); 

     data.push({ 
      Id: i + 1, 
      FirstName: firstName, 
      LastName: lastName, 
      City: city, 
      Title: title, 
      BirthDate: birthDate, 
      Age: age 
     }); 
    } 
    return data; 
} 
<!-- --------------------------------------------------------------------------------- --> 
function onChangeSelection() { 
    var selectedItem = this.dataItem(this.select()); 
    var Text = '<h1><small>row name=</small>' + selectedItem.FirstName + " " + selectedItem.LastName + "</h1>"; 
    console.log(Text); 
    $("#log").html(Text); 
    $("#ordernumber").val(selectedItem.ordernumber); 
} 
<!-- --------------------------------------------------------------------------------- --> 
function startbuttonclick(e) {  
    var data = this.dataItem($(e.currentTarget).closest("tr")); 
    var Text = "<h1><small>Button click name=</small> " + data.FirstName + " " + data.LastName + "</h1>";  
    console.log(Text); 
    $("#log").html(Text); 
    e.preventDefault();       
} 
<!-- --------------------------------------------------------------------------------- --> 
$(document).ready(function() { 
    $("#grid_one").kendoGrid({ 
     dataSource: { 
      data: createRandomData(10), 
      schema: { 
       model: { 
        fields: { 
         FirstName: { type: "string" }, 
         LastName: { type: "string" }, 
         City: { type: "string" }, 
         Title: { type: "string" }, 
         BirthDate: { type: "date" }, 
         Age: { type: "number" } 
        } 
       } 
      }, 
      pageSize: 10 
     }, 
     height: 500, 
     dataBound: saveState, 
     columnResize: saveState, 
     columnShow: saveState, 
     columnHide: saveState, 
     columnReorder: saveState, 
     columnLock: saveState, 
     columnUnlock: saveState,   
     selectable: true, 
     resizable: true, 
     columnMenu: true, 
     scrollable: true, 
     sortable: true, 
     filterable: true, 
     change: onChangeSelection,    
     pageable: { 
      refresh: true, 
      pageSizes: true, 
      buttonCount: 5, 
      pageSizes: [5, 10, 20, 250] 
     }, 
     columns: [ 
      { 
       field: "FirstName", 
       title: "First Name", 
       width: "150px", 
      }, 
      { 
       field: "LastName", 
       title: "Last Name", 
       width: "150px", 
      }, 
      { 
       field: "City", 
       hidden: true 
      }, 
      { 
       field: "Title", 
       hidden: true 
      }, 
      { 
       field: "BirthDate", 
       title: "Birth Date", 
       template: '#= kendo.toString(BirthDate,"MM/dd/yyyy") #', 
       width: "175px", 
      }, 
      { 
       field: "Age", 
       width: "150px", 
      }, 
      { 
       command: { 
        text: "Start", 
        click: startbuttonclick }, 
         title: "Start", 
         width: "65px", 
        attributes:{ 
         "class":"button-center"}    
      } 
     ] 
    }); 
    <!-- ------------------------------------------------------------------------------ -->  
    var grid = $("#grid_one").data("kendoGrid"); 

    function saveState(e) { 
     e.preventDefault(); 
     localStorage["kendo-grid-one"] = kendo.stringify(grid.getOptions()); 
    }; 

    $(function (e) { 
     var options = localStorage["kendo-grid-one"]; 
     if (options) { 
      grid.setOptions(JSON.parse(options)); 
     } else { 
      grid.dataSource.read(); 
     } 
    }); 
}); 
<!-- --------------------------------------------------------------------------------- --> 
</script> 
</body> 
</html> 

ответ

1

редактировал:

  1. Ваш var grid = $("#grid_one").data("kendoGrid"); определен только один раз, и у него могут не быть данных по определенному, это может быть вложено вашим kendogrid после.
  2. Domready часть должна также должна иметь ссылку на него, вы можете поместить его в месте происхождения или переместить его в function

  3. С ваших и dfsq ответов о, проблема в том, что JSON не может сохранить функцию, так что вы должны добавить его обратно при извлечении из localstorage

  4. в текущем коде saveState всегда будет вызываться перед setOptions один, что означает, что saveState просто стерта вашей saveState функции, так что вы должны переместить setoptions code вперед.

изменений много

$(document).ready(function() { 
    // Get options first 
    var options = localStorage["kendo-grid-one"]; 
    if (options) { 
    options = JSON.parse(options); 
    // Workaround to addback event 
    options.columns[6].command.click = startbuttonclick; 
    } 

    $("#grid_one").kendoGrid({ 
     dataSource: { 
      data: createRandomData(10), 
      schema: { 
      ..... 
    }); 
    if (options) { 
    $("#grid_one").data("kendoGrid").setOptions(options); 
    } 
    <!-- ------------------------------------------------------------------------------ -->  

    function saveState(e) { 
    var grid = $("#grid_one").data("kendoGrid"); 
    e.preventDefault(); 
    localStorage["kendo-grid-one"] = kendo.stringify(grid.getOptions()); 
    }; 

См Demo Here, теперь он работает.

  1. saveState использовать часть dfsq может быть лучше
  2. options.columns[6].command.click = startbuttonclick; может быть может написать в более изысканном стиле, но здесь я просто хочу показать, почему вопросы выходят и как применить базовое решение.
+0

Это вызывает: «ReferenceError: сетка не определена» – Bettelbursche

+0

ошибок нет, но никакого эффекта. Теперь изменения в сетке не будут сохранены, например. скрыть столбец. После нажатия F5 (страница обновления) это всегда исходная сетка. – Bettelbursche

+0

@Bettelbursche Отредактировано много, с демо, пожалуйста, проверьте. – fuyushimoya

0

Я не знаю кендо, но проблема должна заключаться в том, что функция saveState вызывается до объявления сетки.

JSFiddle:http://jsfiddle.net/8x7v7mga/1/

Так где-то в строительстве объекта кендо, один из saveState обработчиков называется.

Вы можете избежать этого, объявив переменную сетки первой, а затем в saveState просто проверить, если сетка определяется или нет:

var grid = null; 

$("#grid_one").kendoGrid({ ... }); 

grid = $("#grid_one").data("kendoGrid"); 

function saveState(e) { 
    e.preventDefault(); 
    grid && localStorage["kendo-grid-one"] = kendo.stringify(grid.getOptions()); 
}; 
0

Проблема заключается в том, что функция вызвана до того, как начато значение grid.вы cantually не нужны grid ссылки поскольку saveState называеться в контексте сетки, так что вы можете просто использовать this вместо:

function saveState(e) { 
    e.preventDefault(); 
    localStorage["kendo-grid-one"] = kendo.stringify(this.getOptions()); 
}; 
+0

Thx, но теперь у меня другая проблема. Сначала все работает, но когда я выбираю 1 столбец, чтобы скрыть и обновить страницу, нажмите кнопку «Запустить», кнопка «Старт» в таблице больше не работает. см.: http://dojo.telerik.com/azoto – Bettelbursche

+0

remove 'if (grid) {}' check? – dfsq

+0

Да, его удалили, тот же эффект – Bettelbursche

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