ng-class — поиск значения внутри объекта

У меня есть объект, который выглядит так:

$scope.things = [
    {
        name: 'Bob!',
        short_name: 'bob',
        info: 'something something'
    },
    {
        name: 'Steve',
        short_name: 'steve',
        info: 'something something something'
    },
];

Я перебираю их вот так и добавляю ng-click:

<div ng-repeat="thing in things" ng-click="addThing(thing.name, thing.short_name, thing_info" ng-class="thingClass(thing.name)">content goes here</div>

ng-click="addThing()" в основном группирует значения и добавляет их к объекту.

При нажатии он должен добавить класс selected - это работало отлично и денди, когда я не использовал многомерный объект, потому что он просто искал name внутри объекта/массива (на данный момент я думаю, что это объект... но в то время это был массив)

Я не могу понять, как сделать эквивалент этого...

$scope.thingClass= function(name) {
    if($scope.thingSelected.indexOf(name) != -1) {
        return 'selected';
    }
};

...с объектом в его нынешнем виде. Я попытался адаптировать несколько ответов отсюда, которые я нашел через Google, например:

$scope.teamClass = function(name) {

    var found = $filter('filter')($scope.thingSelected, {id: name}, true);

    if (found.length) {
        return 'selected';
    }

};  

... но без радости.

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


person efreeman    schedule 15.09.2015    source источник
comment
Является ли $scope.thingSelected одним из объектов в $scope.things?   -  person wero    schedule 15.09.2015
comment
тут опечатка ng-click="addThing(thing.name, thing.short_name, thing.info)"   -  person karaxuna    schedule 15.09.2015
comment
что такое $scope.thingSelected ?? это массив объектов, содержащий каждый добавленный объект, или это массив??   -  person Manish Kr. Shukla    schedule 15.09.2015
comment
Пожалуйста, дайте плунжер. опечатка в вызове функции и добавление класса сделано неправильно   -  person binariedMe    schedule 15.09.2015
comment
wero, да - там не на 100% ясно, но я использую $scope.things для создания списка элементов (с ng-repeat), если элемент нажат, он одновременно добавляется в $scope.thingSelected и также должен помечать это элемент, добавив класс   -  person efreeman    schedule 15.09.2015


Ответы (1)


Вы можете просто передать объект вещи в thingClass:

... ng-class="thingClass(thing)" ...

и реализовать thingClass следующим образом:

$scope.thingClass= function(thing) {
    return $scope.thingSelected.indexOf(thing) >= 0 ? 'selected' : '';
}

И, возможно, вам следует применить эту технику и к addThing:

... ng-click="addThing(thing)" ...

$scope.addThing = function(thing) {
    if ($scope.thingSelected.indexOf(thing) < 0)
        $scope.thingSelected.push(thing);
}

Но вместо того, чтобы отслеживать выбранные вещи в массиве, гораздо проще ввести свойство selected в каждую вещь:

$scope.addThing = function(thing) {
    thing.selected = true;
}

$scope.thingClass= function(thing) {
    return thing.selected ? 'selected' : '';
}
person wero    schedule 15.09.2015
comment
Ах, я понимаю, у меня сложилось впечатление, что я не мог просто так передать весь объект, не уверен, откуда у меня это впечатление (вероятно, что-то не связанное с этим пошло не так) ... некоторые перезаписи необходимы, я думаю, спасибо ты - person efreeman; 15.09.2015