2016-03-29 1 views
-1

В моем приложении AngularJS есть флажок. Этот список представляет некоторые интересы пользователя. Пользователь может выбрать один или несколько элементов из списка. HTMLAngularJS: Заполнение списка флажков с двумя массивами JSON и изначально проверено некоторые элементы из одного массива

<html> 
    <head> 
     <title>User Interests</title> 
     <script src="../scripts/angular.min.js"></script> 
     <script src="../scripts/userinterests.js"></script> 
     <script src="//code.jquery.com/jquery-1.12.0.min.js"></script> 
     <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script> 
    </head> 
    <body> 
     <div ng-app="userinterests"> 
     <form ng-submit="submit()" ng-controller="userinterestsCtrl"> 
      <div ng-repeat="userinterest in userinterests"> 
       <input type="checkbox" checkbox-group /> <label>{{userinterest.interestKey}}</label> 
      </div> 
      <input type="submit" id="submit" value="Submit" /> 
     </form> 
     </div> 
    </body> 
</html> 

В моем файле JavaScript первый я получаю список из функции серверной, этот список содержит все интересы. Если этот успех для бэкэнд-звонка, то я вызываю другую функцию, чтобы получить уже выбранные элементы от этого пользователя, это возвращает другой список, который содержит интересы, которые уже выбраны пользователем. Теперь у меня есть два списка (список интересов & список уже выбранных интересов пользователя). Теперь я хочу отобразить список флажков со всеми интересами, но я хочу проверить элементы, которые уже выбраны клиентом.

Это мой Javascript выглядит

var app = angular.module('userinterests', []); 

app.controller('userinterestsCtrl', function($scope, $http) { 
// Get full interests list 
$http({ 
    method : 'POST', 
    url : './test/userInterests', 
    headers : { 
     'Content-Type' : 'application/json' 
    } 
}).success(function(response) { 
    console.log('response=>' + response); 
    $scope.interests_array = []; 
    $scope.userinterests = response; 
    console.log($scope.userinterests); 

    // Get already selected interests 
    $http({ 
     method : 'POST', 
     url : './test/savedInterests', 
     headers : { 
      'Content-Type' : 'application/json' 
     }, 
     params : { 
      user_email : localStorage.getItem("user_email") 
     } 
    }).success(function(response) { 
     console.log('response=>' + response); 
     $scope.savedinterests = response; 
     console.log(response); 
    }).error(function(response, status, headers, config) { 
     console.log('failure'); 
    }); 

}).error(function(response, status, headers, config) { 
    console.log("failure"); 
}); 

$scope.submit = function() { 
    console.log('Submiting...'); 
    console.log($scope.interests_array.join(", ")); 

    var user_email = localStorage.getItem("user_email"); 
    var preferences = "[" + $scope.interests_array.join(", ") + "]"; 

    console.log('preferences=>' + preferences); 

    $http({ 
     method : 'POST', 
     url : './test/setUserInterests', 
     headers : { 
      'Content-Type' : 'application/json' 
     }, 
     params : { 
      user_email : user_email, 
      preferences : preferences 
     } 
    }).success(function(response) { 
     console.log('response=>' + response); 

    }).error(function(response, status, headers, config) { 
     console.log('failure'); 
    }); 
}; 

}).directive(
    "checkboxGroup", 
    function() { 
     return { 
      restrict : "A", 
      link : function(scope, elem, attrs) { 
       // Determine initial checked boxes 
       if (scope.interests_array.indexOf(scope.userinterest.interestKey) !== -1) { 
        elem[0].checked = true; 
       }     

       // Update array on click 
       elem.bind('click', function() { 
        var index = scope.interests_array.indexOf(scope.userinterest.interestKey); 
        // Add if checked 
        if (elem[0].checked) { 
         if (index === -1) 
          scope.interests_array.push(scope.userinterest.interestKey); 
        } 
        // Remove if unchecked 
        else { 
         if (index !== -1) 
          scope.interests_array.splice(index, 1); 
        } 
        // Sort and update DOM display 
        // scope.$apply(scope.array.sort(function(a, b) { 
        // return a - b 
        // })); 
       }); 
      } 
     } 
    }); 

выборочные данные

 $scope.userinterests = [{ 
     "key": "test1", 
     "score": 1.0 
     }, { 
     "key": "test2", 
     "score": 1.0 
     }, { 
     "key": "test3", 
     "score": 1.0 
     }, { 
     "key": "test4", 
     "score": 1.0 
     }, { 
     "key": "test5", 
     "score": 1.0 
     }, { 
     "key": "test6", 
     "score": 1.0 
     }, { 
     "key": "test7", 
     "score": 1.0 
     }, { 
     "key": "test8", 
     "score": 1.0 
     }, { 
     "key": "test9", 
     "score": 1.0 
     }, { 
     "key": "test10", 
     "score": 1.0 
     }, { 
     "key": "test11", 
     "score": 1.0 
     }]; 

     var selectedInterests = [{ 
     "key": "test1", 
     "score": 1.0 
     }, { 
     "key": "test2", 
     "score": 1.0 
     }, { 
     "key": "test3", 
     "score": 1.0 
     }]; 

Я был бы очень ценит, если кто-то может быть настолько любезны, чтобы помочь мне достичь этого.

Спасибо

+0

просто проверить при подготовке UserInterest.interestKey, если savedInterests содержит значение, которое доступно в userInterests, затем отметьте это как отмечено –

+0

loop через userInterests и проверьте каждый элемент, используя метод .contains. если это правда, что в этом элементе нажмите некоторый флаг. –

+0

создать фрагмент скрипки. я буду работать над этим –

ответ

1

Вы можете создать дополнительное свойство selected в массиве userInterests во время выполнения.

userInterests.forEach(function(item){ 
    savedInterests.forEach(function(savedItem){ 
     if(savedItem.interestKey === item.interestKey){ 
     item.selected = true; 
     } 
    }) 
}) 

Затем в шаблоне просто использовать

<div ng-app="userinterests"> 
     <form ng-submit="submit()" ng-controller="userinterestsCtrl"> 
      <div ng-repeat="userinterest in userinterests"> 
       <input type="checkbox" checkbox-group ng-model="userinterest.selected" /> <label{{userinterest.interestKey}}</label> 
      </div> 
      <input type="submit" id="submit" value="Submit" /> 
     </form> 
     </div> 

Надеются, что это помогает.

+0

Используя этот метод в вашем контроллере, он автоматически создаст дополнительное свойство в массиве 'userInterests' только в приложении для вашего представления. –

+0

он просто добавит булев к выбранному объекту. Это не странно. –

+0

Нет, вы делаете это неправильно. он добавит только выделенное свойство в массив объектов –

-1

Я хотел бы использовать только один объект вида модели для этого, который имел свойство дополнительное «выбранный», и связать флажок этого свойства, используя нг-модель.

Таким образом, вы должны создать новый объект, похожий на ответ на userinterests, но имеющего «выбранное» логическое свойство для каждого интереса. Вы можете использовать Array.map для создания этого нового массива.

Затем вы можете использовать ngRepeat для итерации по новому массиву, создавая флажок для каждой записи, привязанный к свойству 'selected'.

Когда вы пишете на сервер, вы можете использовать Array.filter для создания нового массива, содержащего только выбранные записи, например ответ от сохраненных запросов, которые вы упомянули.

0

Используйте $ filter для поиска, а затем добавьте ключ в свой массив user_interest и на основе этого ключа установите/снимите флажок.

$scope.userinterests = [{ 
"key": "test1", 
"score": 1.0 
}, { 
"key": "test2", 
"score": 1.0 
}, { 
"key": "test3", 
"score": 1.0 
}, { 
"key": "test4", 
"score": 1.0 
}, { 
"key": "test5", 
"score": 1.0 
}, { 
"key": "test6", 
"score": 1.0 
}, { 
"key": "test7", 
"score": 1.0 
}, { 
"key": "test8", 
"score": 1.0 
}, { 
"key": "test9", 
"score": 1.0 
}, { 
"key": "test10", 
"score": 1.0 
}, { 
"key": "test11", 
"score": 1.0 
}]; 

var selectedInterests = [{ 
"key": "test1", 
"score": 1.0 
}, { 
"key": "test2", 
"score": 1.0 
}, { 
"key": "test3", 
"score": 1.0 
}]; 
user_interests.map(function(c,i){ 
    var found = $filter('filter')(saved_interests, {key: c.key}, true); 
    if (found.length) { 
     c.active = 1; 
     user_interests[i] = c; 
    } 
}); 
0

Проверьте это. его простой и легкий

var app = angular.module('userinterests', []); 
 

 
app.controller('userinterestsCtrl', function($scope, $http) { 
 

 
    $scope.userinterests = [{ 
 
"key": "test1", 
 
"score": 1.0 
 
    }, { 
 
"key": "test2", 
 
"score": 1.0 
 
    }, { 
 
"key": "test3", 
 
"score": 1.0 
 
    }, { 
 
"key": "test4", 
 
"score": 1.0 
 
    }, { 
 
"key": "test5", 
 
"score": 1.0 
 
    }, { 
 
"key": "test6", 
 
"score": 1.0 
 
    }, { 
 
"key": "test7", 
 
"score": 1.0 
 
    }, { 
 
"key": "test8", 
 
"score": 1.0 
 
    }, { 
 
"key": "test9", 
 
"score": 1.0 
 
    }, { 
 
"key": "test10", 
 
"score": 1.0 
 
    }, { 
 
"key": "test11", 
 
"score": 1.0 
 
    }]; 
 

 
    var selectedInterests = [{ 
 
"key": "test1", 
 
"score": 1.0 
 
    }, { 
 
"key": "test2", 
 
"score": 1.0 
 
    }, { 
 
"key": "test3", 
 
"score": 1.0 
 
    }]; 
 
    for (var i = 0; i < $scope.userinterests.length; i++) { 
 
    if (JSON.stringify(selectedInterests).indexOf(JSON.stringify($scope.userinterests[i])) > 0) { 
 
     $scope.userinterests[i]['active'] = true; 
 
    } 
 
    } 
 
});
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script> 
 
<div ng-app="userinterests"> 
 
    <form ng-submit="submit()" ng-controller="userinterestsCtrl"> 
 

 
    <div ng-repeat="userinterest in userinterests"> 
 
     <input type="checkbox" ng-model='userinterest.active'/> 
 
     <label>{{userinterest.key}}</label> 
 
    </div> 
 
    <input type="submit" id="submit" value="Submit" /> 
 
    <pre>{{selectedInterests | json}}</pre> 
 
    </form> 
 
</div>

Смежные вопросы