Кутні нумар OrderBy сартавання як тэкст у НГ-паўторы

У мяне ёсць гэтыя дадзеныя:

[{"id":"42","firstname":"Sarah","lastname":"Dilby","age":"40","cars":"Yaris"},
{"firstname":"Jason","lastname":"Diry","age":"5","id":"5"},
{"id":"6","firstname":"Bilson","lastname":"Berby","age":"1","cars":"Tipo"}]

Калі я OrderBy ідэнтыфікатара або па ўзросту ў НГ-паўторы, сартуе лік як тэкст. Так як я не магу знайсці гэта напісана, што гэта праблема ў любым месцы, я мяркую, што ёсць праблема з маім кодам. Я стварыў гэтую скрыпку: http://jsfiddle.net/vsbGH/1/ Sorry аб шаблоне, але jsfiddle Абыякава » т дазваляюць у HTML акне. Ва ўсякім разе, гэта код, які загружае і сартуе дадзеныя:

//user data
app.service('People', function() {
var People = {};
People.details = [{"id":"42","firstname":"Sarah","lastname":"Dilby","age":"40","cars":"Yaris"},
                  {"firstname":"Jason","lastname":"Diry","age":"5","id":"5"},
                  {"id":"6","firstname":"Bilson","lastname":"Berby","age":"1","cars":"Tipo"}]
return People;
});

//list ctrl
controllers.listCtrl = function ($scope,People) {
 $scope.people = People.details;

 $scope.sortList = function(sortname) {
    $scope.sorter = sortname;
 }
}

І гэта НГ-паўтор частка шаблону:

<tr ng-repeat="person in people | orderBy:sorter ">
        <td>{{person.id | number}}</td>
        <td>{{person.firstname}} </td>
        <td>{{person.lastname}} </td>
        <td>{{person.age | number}}</td>
        <td>{{person.cars}} </td>
 </tr>

Вялікі дзякуй, калі вы можаце дапамагчы мне зразумець, чаму дадзеныя нумар ня сартаваць як лікі, і чаму гэта сартаванне як тэкст.

31

7 адказы

Я думаю, найбольш прыдатным рашэннем з'яўляецца фарматаванне лікаў у мяне на аб'екты JSON правільна, гэта значыць не абгарнуць іх у двукоссі. Такім чынам:

 [{"id":"42","firstname":"Sarah","lastname":"Dilby","age":"40","cars":"Yaris"},
  {"firstname":"Jason","lastname":"Diry","age":"5","id":"5"},
  {"id":"6","firstname":"Bilson","lastname":"Berby","age":"1","cars":"Tipo"}]

будзе выглядаць так:

[{"id":42,"firstname":"Sarah","lastname":"Dilby","age":40,"cars":"Yaris"},
 {"firstname":"Jason","lastname":"Diry","age":5,"id":5},
 {"id":6,"firstname":"Bilson","lastname":"Berby","age":1,"cars":"Tipo"}]

Я мяркую, што рашэнне SergL гэта добра, калі гэта не ўяўляецца магчымым, каб выправіць фармат дадзеных JSON.

Каб дадаць да гэтага, праблема ў маім канкрэтным выпадку гэта зрабіць з дапамогай функцыі json_encode РНР на боку сервера. Па змаўчанні, ён апрацоўвае колькасці як радка. Каб выправіць мне прыйшлося дадаць JSON_NUMERIC_CHECK для метаду кадавання ў PHP скрыпт:

json_encode($assoc_array,JSON_NUMERIC_CHECK);
49
дададзена
Я JSON_NUMERIC_CHECK першы раз, і яго проста дзіўным.
дададзена аўтар RN Kushwaha, крыніца
JSON_NUMERIC_CHECK дзіўна. Гэта працавала як шарм, дзякуючы @dewd!
дададзена аўтар jordan.peoples, крыніца
FYI JSON_NUMERIC_CHECK, можа прывесці да паломкі рэчаў таксама. Яна выдаляе вядучыя нулі. напрыклад. нумар тэлефона, 0401231234 становіцца 401231234.
дададзена аўтар Firze, крыніца
@Firze Я ніколі не разглядаю нумар тэлефона як «колькасць» яна заўсёды павінна заставацца радком.
дададзена аўтар Amir Savand, крыніца
да галасавання за JSON_NUMERIC_CHECK!
дададзена аўтар James McCormac, крыніца
Я проста павінен быў зрабіць JSON_NUMERIC_CHECK рэч сёння. Ніца.
дададзена аўтар Dominik Pawlak, крыніца

Вы не павінны змяняць свой JSON. Вы можаце перадаць функцыю OrderBy фільтра, як гэта:

$scope.sorterFunc = function(person){
    return parseInt(person.id);
};

<tr ng-repeat="person in people | orderBy:sorterFunc ">
        <td>{{person.id | number}}</td>
        <td>{{person.firstname}} </td>
        <td>{{person.lastname}} </td>
        <td>{{person.age | number}}</td>
        <td>{{person.cars}} </td>
 </tr>
28
дададзена
Для таго, каб замовіць па змяншэнні Вы можаце дадаць - перад тым ParseInt (): вяртанне - (ParseInt (person.id)); ці нават лепш, вы можаце дадаць параметр ў sorterFunc, каб паказаць тып сартавання ASC або DESC
дададзена аўтар Ragnar, крыніца
то як чалавек атрымаць прайшло тут
дададзена аўтар Omar, крыніца
як зрабіць заказ па змяншэнні?
дададзена аўтар Biswas Khayargoli, крыніца
дзякуй выратавала мой дзень!
дададзена аўтар Biswas Khayargoli, крыніца

Ўнутры вашай дырэктывы НГ паўтораў вы карыстаецеся нумар фільтр

<td>{{person.id | number}}</td>

Фільтры выкарыстоўваюцца для фарматавання вываду, але яны не абнаўляюць ўласцівасць мадэлі. Напрыклад: person.id = 1.234,56789 будзе аказаны, як 1,234.568.

Як згадвалася вышэй, вы павінны пераўтварыць ўзрост набраць нумар. Тады OrderBy будзе працаваць як належыць. Напрыклад ўнутры вашай службы:

angular.forEach(People.details, function (detail) {
  detail.age = parseFloat(detail.age);
});
15
дададзена
@SergL Я толькі twigged, што ў вуглавым прыкладзе DOCS, лік ў дадзеных JSON ня загорнутыя ў двукоссях. Я мяркую, што гэта тое, што я павінен рабіць з маімі дадзенымі JSON.
дададзена аўтар dewd, крыніца

if your orderBy value is not a variable pointing to another string but rather the attribute by which you'll be sorting, you must put it in quotes.

person in people | orderBy:'-id'

If, after you've parsed your int or float and are still not sorting correctly, it might be because of this. <:/ (that's my dunce cap)

5
дададзена

Я сутыкнуўся з той жа праблемай, калі я працаваў з тэкставым полем і ngModel змяніць значэнне мадэлі, якую я замаўляў міма. Паколькі значэнне разглядаецца як радок.

With new HTML5 <input type="number" />, Angular parses the value of the input field to a number (float I think), which helped me to get the correct order.

3
дададзена

Лепш за ўсё, каб абнавіць паўтаральную калекцыю кожны раз, калі функцыя сартавання называецца. Тут я выкарыстоўваю Lodash - OrderBy проста замовіць калекцыю, заснаваную на функцыі сартавання. Дапусцім, сартаванне выклікаецца пстрычкай галавы слупка табліцы.

прыклад:

аб'ект Collection:

ctrl.people = [{"id":"42","firstname":"Sarah","lastname":"Dilby","age":"40","cars":"Yaris","salary": 700}, {"firstname":"Jason","lastname":"Diry","age":"5","id":"5","cars":"Lexia","salary": 500},{"id":"6","firstname":"Bilson","lastname":"Berby","age":"1","cars":"Tipo","salary": 400}];

Карыстальнік націскае слупок галаву сартаваць па ўзросце:

<th class="col-age" data-ng-click="ctrl.sortColumn('age')">Age</th>

Метад называецца:

ctrl.sortColumn('age');//where age is column containing numbers only

Рэалізацыя метаду:

ctrl.sortedCol = 'firstname';    //Default sort column

ctrl.sortColumn = (column) => {
    ctrl.sortedCol = column; //age
    let order = 'asc'; //you can decide the order based on your own logic
    ctrl.people = _.orderBy(ctrl.people, [ctrl.sorter], [order]);   //update the collection
};

ctrl.sortColumn(ctrl.sortedCol); //called on initial rendering

Функцыя сартавальнік: вяртае адсартаваны калекцыю на аснове калоннай тыпу

ctrl.sorter = (item) => {
    const columnType = ctrl.getColumnType();
    if(item[ctrl.sortedCol] && columnType === 'string'){
        return item[ctrl.sortedCol].toLowerCase();
    } else if(item[ctrl.sortedCol] && columnType === 'number'){
        return parseInt(item[ctrl.sortedCol]);
    } else{
        return item[ctrl.sortedCol];
    }    
};

Вызначце тып калонак: Можа быць радок, лік або нават дата

ctrl.getColumnType =() => {
    if(ctrl.sortedCol === 'firstname' || ctrl.sortedCol === 'lastname' || ctrl.sortedCol === 'cars'){
        return 'string';
    } else if(ctrl.sortedCol === 'salary' || ctrl.sortedCol === 'age'){
        return 'number';
    }
};
1
дададзена
Паважаны downvoter, Любыя праблемы з гэтым падыходам?
дададзена аўтар rach8garg, крыніца

Хай OrderBy кропка метады, якая належыць вобласць ці яго не ізаляваныя продкамі, і хай гэты метад вяртае лік з прывядзеннем з радка. Вы, магчыма, прыйдзецца напісаць дырэктыву успадкоўваючы чалавек аб'ём, створаны экземплярамі ngRepeat .. дадаць гэты метад.

Акрамя таго, у вашым выпадку, узрост з'яўляецца радком, дзе яна магла б быць цэлым лікам і таму лікавая сартаванне будзе першапачаткова прымяняцца.

Калі вы не можаце змяніць ServerSide дадзеных, то змяніць яго баку кліента пры выманні.

0
дададзена