1
  • Мне нужно разработать таблицу в угловых js, чтобы показать данные сторонних производителей (и, следовательно, данные не могут быть изменены).
  • Данные, которые будут показаны, полностью динамичны в том количестве или последовательности столбцов, которые могут быть изменены в любое время.
  • Значение, которое должно отображаться, может быть числом или строкой или датой, которая определяется данными третьей стороны.
  • Мне нужно сортировать таблицу при нажатии на любой из заголовков
  • Мне известны некоторые методы, как использование | число фильтр и т. д., но он не работает в этой динамической среде.

Следовательно, мне нужно сделать мой стол полностью динамичным. Однако я столкнулся с проблемами при использовании порядка, так как сортирует даже числа и даты, рассматривая их как строку.AngularJS orderby сортирует число и даты, обрабатывая их как строку

<table> 
<td ng-repeat="key in keys(Header[0])" ng-click="maintainOrder(key)" > 
     <span>{{Header[0][key]}}</span> 
    </td> 

<tr ng-repeat="singleRow in data | orderBy:orderByCriteria:reverseSort" > 
     <td ng-repeat="key in keys(data[0])" > 
     {{singleRow[key]}} 
     </td> 

    </tr> 
</table> 


    $scope.maintainOrder = function(key) 
    { 
    $scope.orderByCriteria = key; 
    $scope.reverseSort = ! $scope.reverseSort; 
    }; 
    $scope.keys = function(obj){ 
    console.log((Object.keys(obj))); 
    return obj? Object.keys(obj) : []; 
    }; 
    $scope.data= [ 
       { 
       "quantity" : "85", 
       "type" : "mango", 
       "expiryDate" : "15/09/2015" 
       }, 
       { 
       "quantity" : "9", 
       "type" : "orange", 
       "expiryDate" : "5/07/2015" 
       }, 
       { 
       "quantity" : "66", 
       "type" : "apple", 
       "expiryDate" : "25/09/2015" 
       }, 
       { 
       "quantity" : "95", 
       "type" : "mango", 
       "expiryDate" : "31/08/2015" 
      } 
       ]; 
    $scope.Header= [ 
       { 
       "quantity" : "Qty ", 
       "type" : "Type", 
       "expiryDate" : "Expiry_Date" 
       }]; 

Я включил скрипку за то же самое: fiddle link

+0

Ну, ваши цифры не цифры, а строки. И то же самое для ваших дат. Сделайте их номерами и датами, и все будет хорошо. –

+0

Но, как я сказал, я не могу внести никаких изменений в данные сторонних разработчиков – shubh

+0

Да, вы можете. Просто используйте JavaScript, чтобы преобразовать сторонние строки в числа или даты перед их сортировкой. Конечно, если вы даже не можете знать, что должен содержать столбец, тогда вся надежда теряется (за исключением использования эвристики, чтобы угадать тип и формат столбца на основе того, что он содержит). –

ответ

0

Вы можете создать свой собственный пользовательский сортировки фильтр, и использовать угловую встроенные функции angular.isNumber, angular.isDate, угловой. IsString

Примером пользовательского фильтра здесь: http://jsfiddle.net/av1mLpqx/1/

В пользовательском фильтре, используйте пользовательскую функцию сортировки, как это:

array.sort(function (a, b) { 
     if (angular.isNumber(a) && angular.isNumber(b)) { 
     return a - b; 
     } 
     else if (angular.isDate(a) && angular.isDate(b)) {   
     return a.getTime() - b.getTime(); 
     } 
     else if (angular.isString(a) && angular.isString(b)) { 
     return a.localeCompare(b); 
     }  
     else { 
     console.log("types unknown"); 
     return 0; 
     } 
} 
+0

Привет, Джо, спасибо за ваш ответ. Но я думаю, что angular.isNumber() и angular.isDate() не могут обнаружить числа и даты из данных, полученных от третьей стороны (которая фактически является строкой) Кроме того, я не думаю, что смогу реализовать функциональность сортировки, щелкнув заголовок столбца, используя вышеприведенный подход. Можете ли вы создать скрипку или обновить мою скрипку, если эта функциональность действительно работает. Спасибо – shubh

+0

Я проверил isNumber и isString в ссылке на скрипку, которую я перечислил выше. Они работали. Возможно, вам придется предоставить свои форматы дат синтаксическому анализатору, прежде чем вы сможете использовать функцию getTime(). Но это также будет работать в массиве array.sort, так как это будет сравнение миллисекунд. Чтобы получить обратный порядок сортировки, вам нужно будет отменить уравнения, вместо «a - b» вы будете использовать «b - a». Возможно, вы можете ввести $ scope в свой фильтр и использовать reverseSort для обращения к уравнениям. Другой вариант - умножить уравнения на -1, чтобы изменить сортировку. Я не могу следовать вашему сценарию скрипта, не указано ни одно приложение –