2015-12-17 3 views
1

У меня есть этот код:OrderBy в угловых/html

<div flex="66"> 
      <h3>{{ hack.title }}</h3> 
      <h4>{{ hack.description }}</h4> 
      <h4>{{ hack.status }}</h4> 
      <p>Backs: {{ hacksCtrl.getBacks(hack.id) }}</p> 
      </div> 

Я в принципе хочу заказать по Backs в основном означает likes, так что чем больше любит что-то есть, тем выше на странице будет отображаться.

Так что я сделал это, но он не работает:

ng-repeat="hack in hacksCtrl.hacks | orderBy: hacksCtrl.getBacks()" 

какие-либо идеи?

благодаря

контроллер ниже:

import Chance from 'chance'; 
export default function(hack, $state, $sce, HacksService, user) { 
    const vm = this; 
    vm.hack = hack; 

    vm.trustSrc = function(src) { 
    return $sce.trustAsResourceUrl(src); 
    }; 

    vm.save = function() { 
    HacksService.save(vm.hack); 
    $state.go('hacks.view', { 
     id: vm.hack.id 
    }); 
    }; 

    vm.create = function() { 
    const chance = new Chance(); 

    vm.hack.id = chance.guid(); 
    vm.hack.status = 'proposed'; 
    vm.hack.createdBy = user.name; 
    vm.hack.userProfileImage = user.picture; 
    HacksService.create(vm.hack); 
    $state.go('hacks.view', { 
     id: vm.hack.id 
    }); 
    }; 

    vm.like = function(id, $event) { 
    $event.stopPropagation(); 
    HacksService.like(id, user); 
    }; 
    vm.hasLiked = function() { 
    const userId = user.id; 
    const likes = vm.hack.likes; 

    if (likes) { 
     return (likes.indexOf(userId) !== -1); 
    } 
    }; 
    vm.getLikes = function() { 
    return (vm.hack.likes) ? vm.hack.likes.length : 0; 
    }; 

    vm.isCreate = function() { 
    return !vm.hack; 
    }; 

    vm.goToEdit = function(id) { 
    $state.go('hacks.edit', { 
     id: id 
    }); 
    }; 
} 
+0

поставить переменную ваша область, у которой есть hacksCtrl.getBacks (hack.id), и попробуйте упорядочить с помощью переменной области – Manticore

+0

, почему именно 'orderBy: hack.title' не упорядочивает ее по алфавиту? –

+1

, пожалуйста, покажите сценарий контроллера –

ответ

0

Это не работает, потому что, as stated in the Angular Documentation, OrderBy ожидает аргумент, чтобы быть одним из:

  • function: функция Getter. Результат этой функции будет отсортирован с использованием оператора <, ===, >.

  • string: Угловое выражение. Результат этого выражения используется для сравнения элементов (например, имя для сортировки по свойству с именем name или name.substr (0, 3) для сортировки по трем первым символам свойства, называемому именем). Результат константного выражения интерпретируется как имя свойства, которое должно использоваться при сравнении (например, «специальное имя» для сортировки объекта по значению их специального свойства имени). Выражение может быть необязательно префикс + или - для управления порядком сортировки по возрастанию или убыванию (например, + имя или -name). Если свойства не предоставлены (например, «+»), то сам элемент массива используется для сравнения сортировки.

  • Array: Массив функций или предикатов строк. Первый предикат в массиве используется для сортировки, но когда два элемента эквивалентны, используется следующий предикат.

hackCtrls.getBack(hack.id) не является ни один из указанных выше.

Таким образом, чтобы решить вашу проблему, вы можете пройти обратный вызов OrderBy вместо или свяжите «как» собственность на хак и сортировать по имени свойства:

  1. ng-repeat="hack in hacksCtrl.hacks | orderBy: hacksCtrl.getBacks" и модифицируют getBacks бы:

    vm.getBacks = function(hack) { 
        return hack.backers ? hack.backers.length : 0; 
    } 
    

    необходимо, чтобы vm.hacks = [/* multiple hacks */]

  2. ng-repeat="hack in hacksCtrl.hacks | orderBy: 'likes', предполагающее хаки имеет т он like Недвижимость.

+0

ok имеет смысл, и я попробовал оба ваших решения, но ни один из них не работал? –

+0

Потому что getbacks должен принять аргумент (взломать), теперь getBacks просто смотрят на один взлом? Разве у вас их нет? Почему они не определены в контроллере? – charlespwd

+0

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

1

В вашей функции getBacks отсутствует параметр id.

изменить: проверить функцию getBacks и проверить, вернулись ли значения, которые вы ожидали. Я не уверен в вашем коде, если вы извлекаете эти данные отдельно.

1

Для вашей функции, передать весь объект ножовкой, а затем только имя функции в операторе OrderBy

vm.getBacks = function(hack) { 
    return (hack.backers) ? hack.backers.length : 0; 
}; 

Ваш угловой повтор будет выглядеть примерно так:

ng-repeat="hack in hacksCtrl.hacks | orderBy: hacksCtrl.getBacks" 
+0

попробовал это и, похоже, не работает, код был изменен кем-то другим, поэтому я буду пересказывать то, что у меня есть –

+0

Я больше не вижу функцию «getBacks» в вашем контроллере. Мне это не хватает? – birwin

+0

он был изменен на getLikes –