Nano Hash - криптовалюты, майнинг, программирование

Преобразование строки в массив с использованием фильтра и использование его в ng-repeat

У меня есть строка в формате «1200:2,1300:3,1400:2». Мне нужно, чтобы это было напечатано как

 <p>1200</p><p>2</p>
 <p>1300</p><p>3</p>
 <p>1400</p><p>2</p>

Я попытался использовать фильтр,

return function (input) {
                //Validate the input
                if (!input) {
                    return '';
                }
                var hoaArray = [];
                var inputArray = input.split(',');
                for (var i = 0; i < inputArray.length; i++) {
                    var adminTimeArray = inputArray[i].split(':');
                    hoaArray.push({ 'adminTime': adminTimeArray[0], 'dose': adminTimeArray[1]?adminTimeArray[1]:'' });
                }
                return hoaArray;
            };

и внутри html как

<p ng-repeat="timing in timing_list | formatter">{{timing.}}</p>{{timing .adminTime}}</div>

Я получаю следующую ошибку,

Ошибка: [$rootScope:infdig] достигнуто 10 итераций $digest(). Прерывание! Наблюдатели, запущенные за последние 5 итераций: [[{"msg":"fn: RegularInterceptedExpression","newVal":36,"oldVal":34}],[{"msg":"fn: RegularInterceptedExpression","newVal" :38,"oldVal":36}],[{"msg":"fn: RegularInterceptedExpression","newVal":40,"oldVal":38}],[{"msg":"fn: RegularInterceptedExpression"," newVal":42,"oldVal":40}],[{"msg":"fn: RegularInterceptedExpression","newVal":44,"oldVal":42}]]

Может ли кто-нибудь помочь мне понять, что я делаю неправильно?

С уважением, Раадж


  • Побродив вокруг, нашел решение (я не уверен). Используется ng-init для временного хранения отформатированного массива в родительском теге и используется переменная ng-init для итерации, <label ng-init="timingArray = (timing_list | formatter)">Timing:</label> <p ng-repeat="timing in timingArray track by $id(timing)"> {{timing.adminTime}} : {{timing.dose}} </p> 19.03.2015

Ответы:


1

В файле IndexController.js:

 var inputString = "1200:2,1330:3,1400:4,1500:3";

    var formatInputString = function (input) {
        //Validate the input
        if (!input) {
            return '';
        }
        var hoaArray = [];
        var inputArray = input.split(',');
        for (var i = 0; i < inputArray.length; i++) {
            var adminTimeArray = inputArray[i].split(':');
            hoaArray.push({ 'adminTime': adminTimeArray[0], 'dose': adminTimeArray[1] ? adminTimeArray[1] : '' });
        }
        return hoaArray;
    };

    $scope.inputString = inputString;
    $scope.formattedString = formatInputString(inputString);

В HTML-файле:

<div ng-repeat="timing in formattedString" >
    {{timing.adminTime}}
    {{timing.dose}}
    </div>
19.03.2015
  • Я думал об этом, но поскольку это всего лишь одно свойство внутри большого массива JSON. Поэтому я попытался не привязывать его к конкретному экрану, а сделать его более универсальным, чтобы я мог повторно использовать его и сделать его более удобным в сопровождении. 19.03.2015
  • Вы можете вставить сюда свой ответ JSON? 19.03.2015
  • он содержит некоторую конфиденциальную информацию, которую я не могу вставить сюда. Извиняюсь 19.03.2015
  • вставьте пример (удалите конфиденциальную информацию), просто хотите получить общий формат вашего JSON 19.03.2015

  • 2

    Проблема здесь — возможно, ограничение или ошибка в Angular — заключается в том, что ваш фильтр создает новые объекты массива каждый раз, когда он запускается. ng-repeat использует под прикрытием $scope.$watchCollection следить за выражением "timing_list | formatter" — этот наблюдатель всегда спотыкается, потому что, пытаясь обнаружить изменение значений в коллекции, он сравнивает объекты с простым "!==" — а объекты всегда новые и разные объекты.

    Короче говоря, это еще один способ воспроизвести:

    $scope.items = [1, 2, 3];
    $scope.$watchCollection("items | foo", function(){
    });
    

    где foo — это фильтр, который работает с каждым элементом массива, создавая новый объект:

    .filter("foo", function(){
      return function(inputArray){
        return inputArray.map(function(item){
          return {a: item};
        });
      };
    });
    

    Итак, чтобы ответить на ваш вопрос - вы не можете с Angular v1.3.15 использовать фильтр, который возвращает массив с объектами (без какого-то фанкового кэширования объектов) с $watchCollection и, соответственно, с ng-repeat.

    Лучше всего сначала создать массив (с помощью ng-init или в контроллере), а затем использовать его в ng-repeat.

    19.03.2015
  • @Raajkumar, хорошо ... по крайней мере, ты знаешь, что нет другого более простого способа 19.03.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..