Дросселирование с заглушкой - PullRequest
3 голосов
/ 30 марта 2012

У меня проблема с плагином для нокаутирующего отображения в IE8.Наша ситуация такова, что мы отправляем все возможные записи, которые могут быть показаны клиенту.Затем мы обрабатываем все подкачки и фильтрацию на стороне клиента для отзывчивой системы.

В настоящее время мы отправляем список из 250 записей для отображения в сетке на основе шаблона jQuery через jQuery ajax.Когда мы вызываем ko.mapping.fromJS (не функцию fromJSON) для сопоставления объектов, мы получаем сообщение «Сценарий слишком длинный» из IE8.Не происходит в FF и Chrome, так как их java-скрипт выполняется намного быстрее.

Есть ли прямой способ ограничить отображение?Это долгосрочная проблема, поскольку у нас может быть ситуация, когда у нас есть около 1000 записей для отправки клиенту.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

IE - капризный маленький ..... не так ли.

При выполнении привязки данных с помощью JavaScript, если будет значительное обновление пользовательского интерфейса, я делаю что-то вроде следующего.

function ajaxCallback(listOfDataItems){

  var addToUiFunction = function(item){
     // add it to the ko.observable array which is data bound to the UI
     myDataBoundArray.push(item);
  };

  for (var i = 0, arrayLength = listOfDataItems.length; i < arrayLength; i++){
    var temp = listOfDataItems[i];

    //create an immediately executing function to close around
    //the item that returns a function to call at a later date.
    var tempFunction = (function(){
      var item = temp;
      return function() { addToUiFunction(item) };
    })();

    setTimeout(tempFunction, 0);

  }
}

Что здесь произошло, так это то, что я добавляю только один элемент в пользовательский интерфейс одновременно.Я использую setTimeout с задержкой 0, чтобы отложить выполнение отдельного добавления до завершения текущего вызова.Это означает очень короткие единицы работы, которые не будут превышать время вашего браузера.

ps код немного хитрый, он просто пытается проиллюстрировать точку.

0 голосов
/ 13 декабря 2012

Я знаю, что это не идеальный ответ, но если ваша ситуация позволяет, вы всегда можете просто не отображать внутренние элементы.Ex.Если ваш вызов ajax возвращает 1000 человек, и вы хотите, чтобы ваш пользовательский интерфейс обновлял и отображал всех этих людей, вы можете сделать так, чтобы у вашей модели представления был observableArray из необработанных объектов js (а не их сопоставленный ko эквивалент).Если вы добавляете или удаляете элементы из вашего observableArray, он будет правильно отображаться в пользовательском интерфейсе, но это не поможет вам, если нужно подписаться на все события изменения свойств для всех свойств каждого человека.

Обычнокогда я вытягиваю столько элементов, это для отчетов, поэтому мне не нужно редактировать сами элементы, но нужно добавлять / удалять строки в отчете в зависимости от критериев фильтра.

0 голосов
/ 06 июля 2012

У нас тоже была такая же проблема. У нашей модели представления было слишком много вычисляемых наблюдаемых, и это заставляло скрипт работать медленнее. Удаление ненужных подписчиков может избавить вас от этой проблемы.

...