2016-01-03 4 views
0

я сфера под названием $scope.users, который возвращает всех пользователей в моем приложении, как так,Сравните два набора объектов

[{"id":1,"name":"Peter Boomsma"}, 
{"id":2,"name":"Jan Jansen"}, 
{"id":3,"name":"Kees Keesen"}, 
{"id":4,"name":"Piet Pietersen"}] 

Тогда у меня есть сфера называется $scope.current_user, который возвращает текущие пользователи, и корочки пользователей он следует,

{"id":4,"name":"Piet Pietersen","following":[ 
    {"id":1},{"id":2},{"id":4}] 
} 

у меня есть нг-повтор, которая показывает все пользователь, и followUser действия для каждого пользователя,

%ul{"ng-repeat" => "user in users"} 
    %li 
    name: {{ user.name }} 
    %a{"ng-click" => "followUser(user)"} Follow user. 

Проблема заключается в том, что я не могу различать пользователя, который уже выполняется, и пользователя, которого не соблюдают. Таким образом, действие followUser всегда есть. Я хотел бы дать пользователям, что текущий пользователь выполняет различные действия, такие как unfollowUser.

У меня есть идентификаторы пользователей, за которыми следует текущий пользователь, но я не знаю, как предоставить этим пользователям другую кнопку. Что-то вроде unfollowUser.

* обновление *

Я получил это работает (по крайней мере, несколько), используя Mihail его предложение,

Когда я иду в шаблон пользователя Загружаю userCtrl,

usersService.loadUsers().then(function(response) { 
    $scope.users = response.data; 

    angular.forEach(response, function(user){ 
    $scope.user = user 

    $scope.isFollowed = function(userId) { 
     var following = $scope.current_user.following; 
     for (var i=0; i<following.length; i++) { 
     if (following[i].id == userId) { 
      return true; 
     } 
     } 
     return false; 
    } 
    }) 
}) 

И в моем шаблоне у меня есть,

%ul{"ng-repeat" => "user in users"} 
    %li 
    name: {{ user.name }} 
    %a{"ng-click" => "followUser(user)", "ng-show" => "!isFollowed(user.id)"} follow 
    %a{"ng-click" => "unfollowUser(user)", "ng-show" => "isFollowed(user.id)"} unfollow 

Это прекрасно работает. Когда пользователь следит, используется функция unfollowUser. Проблема в том, что когда я отключаю пользователя от пользователя, представление не обновляется. Я должен обновить страницу, чтобы увидеть эффект отменить подписку.

Я попытался положить init в конце действий unfollowUser, как это так,

$scope.unfollowUser = function(user){ 
    unfollowFriend.unfollowFriend(user).then(function(){ 
    },function(){ 
    }).then(init); 
    Notification.success(user.name + ' is verwijderd als vriend.'); 
} 

первонача

var init = function(){ 
    console.log ('renew') 
    usersService.loadUsers().then(function(response) { 
    $scope.users = response.data; 

    angular.forEach(response, function(user){ 
     $scope.user = user 

     $scope.isFollowed = function(userId) { 
     var following = $scope.current_user.following; 
     for (var i=0; i<following.length; i++) { 
      if (following[i].id == userId) { 
      return true; 
      } 
     } 
     return false; 
     } 
    }) 
    }) 
} 

Я получаю renew сообщений в моем журнале браузера, но просмотр не обновляется.

+0

Я upvoted ответ MrRanos. Его концепция верна, но реализация этого будет иметь значение, так как ваша пользовательская база и последователи увеличиваются. Вы должны изменить свой массив 'follow', чтобы быть объектом, хранящим идентификаторы пользователя как ключи. Вы можете хранить что-то в значении, относящемся к пользователю, но это не имеет значения для требований, которые вы опубликовали.Это приведет к постоянному выполнению вашего алгоритма по времени, когда вы ищете конкретный идентификатор пользователя (ключ), а не итерацию через гигантский массив последователей. – Haymaker87

+0

Я согласен с @ Haymaker87, когда у вас огромное количество пользователей, это не будет хорошим решением. Я предлагаю, чтобы в вашей функции init после загрузки пользователей вы могли добавить атрибут для каждого пользователя, если он соблюден или нет. Затем на основе этого атрибута выполните проверку. Также, когда вы хотите следовать или отменить подписку на пользователя, вам необходимо обновить атрибут, чтобы представление было обновлено. –

+0

Благодарим вас за ввод. Вы говорите, что> обновите атрибут, чтобы представление было обновлено, но какой атрибут это будет? Потому что я использую пользователей для отображения пользователей, и когда пользователь следует/отменяет, что изменение находится внутри контроллера отношений. –

ответ

2

Я не очень хорошо Haml, так что я напишу простой HTML пример:

<div ng-repeat="user in users"> 
    <div ng-show="isFollowed(user.id)" ng-click="unfollowUser(user)">unfollow</div> 
    <div ng-show="!isFollowed(user.id)" ng-click="followUser(user)">follow</div> 
</div> 


$scope.isFollowed = function(userId) { 
    var following = $scope.current_user.following; 
    for (var i=0; i<following.length; i++) { 
    if (following[i].id == userId) { 
     return true; 
    } 
    } 
    return false; 
} 
+0

Что такое' userId' в этом случае? –

+0

Вы должны перебирать всех пользователей в списке. Затем в каждом цикле вы передадите id текущего итерационного пользователя в 'isFollowed'. Там вы будете проверять, находится ли этот идентификатор в '$ scope.current_user.following' - если истинный текущий пользователь следит за этим пользователем, если false. –

+0

Хорошо. У меня это работает, спасибо за это. Но, похоже, я не могу изменить представление, когда пользователь следит/не отвечает. Я обновил свой вопрос, чтобы отразить текущий код. –

1

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

$scope.isFollowed = function (userID) { 
    //check if the userID is in$scope.current_user.following 
    //return a boolean 
} 

затем в HTML код можно будет проверить на основе этой функции, если показать followUser или unfollowUser.