Связывание контактов пользователя в firebase с помощью md-contacts-chips
У меня возникают проблемы с тем, как я могу связать свои контакты пользователей в Firebase с md-contacts-chips с https://material.angularjs.org/0.11.2/.
По сути, каждый зарегистрированный пользователь может добавлять знакомых по электронной почте в свой список контактов. Структура Firebase пользователей выглядит следующим образом:
firebase
-$uid1
contacts
$uid2 - userObject
$uid3 - userObject
-$uid2
contacts
$uid1 - userObject
$uid3 - userObject
-$uid3
contacts
$uid1 - userObject
$uid2 - userObject
etc..
Можно ли повторить контакты пользователей в виде массива объектов?
Как настроить чип md-contacts-chip?
В примере есть функция loadContacts(), в которой установлены контакты. Как бы я мог установить свои пользовательские объекты в качестве контактов? Возвращаемый объект - это контакт, и я хотел бы найти способ вернуть ему запрашиваемый объект.
function loadContacts() {
var contacts = [
'Marina Augustine',
'Oddr Sarno',
'Nick Giannopoulos',
'Narayana Garner',
'Anita Gros',
'Megan Smith',
'Tsvetko Metzger',
'Hector Simek',
'Some-guy withalongalastaname'
];
return contacts.map(function (c, index) {
var cParts = c.split(' ');
var contact = {
name: c,
email: cParts[0][0].toLowerCase() + '.' + cParts[1].toLowerCase() + '@example.com',
image: 'http://lorempixel.com/50/50/people?' + index
};
contact._lowername = contact.name.toLowerCase();
return contact;
});
}
Спасибо
1 ответ
Я ни в коем случае не эксперт, просто фанатик проб и ошибок. Это сказало, что я заставил это работать. Проблема заключается в том, что "md-contact-chip" использует "push and splice" для настройки массива, и в качестве состояния firebase это плохая идея. Если бы у нас был доступ для замены push на $add() или сплайсинга на $remove(), это должно работать правильно.
Я смотрел на настройку пользовательских чипов, и это кажется возможным, потому что вы можете вызвать функцию во время добавления и удаления чипа, тогда с помощью пользовательского шаблона чипа может выглядеть так же, как контактные чипы.
В любом случае, вот что я сделал, чтобы заставить его работать с md-contact-chips. Также я настроил это для работы со списком элементов, а не с контактами, потому что я хотел изображение для элементов.
Ключом к этому должно быть получение всей вашей персоны obj, затем установите ng-model="ctrl.person.contacts" внутри контроллера, убедитесь, что создан массив, если person.contacts не существует. "ctrl.person.contacts = ctrl.person.contacts || [];
Да, вы не обновляете объект firebase должным образом, но когда вы запускаете ctrl.person.$ Save(), вы просто полностью обновляете базу данных.
Html
<div layout="column" ng-cloak>
<div>
<p>Items selected</p>
<pre>{{ctrl.item.installedItems}}</pre>
</div>
<input type="button" ng-click="ctrl.updateInstalledItems()" value='update'>
<md-content class="md-padding autocomplete" layout="column">
<md-contact-chips
ng-model="ctrl.item.installedItems"
md-contacts="ctrl.querySearch($query)"
md-contact-name="alseSn"
md-contact-image="image"
md-require-match="true"
md-highlight-flags="i"
filter-selected="ctrl.filterSelected"
placeholder="Select installed items">
</md-contact-chips>
</md-content>
</div>
контроллер
app.controller('ItemChipCtrl', ['items', 'item', '$q', '$log',
function (items, item, $q, $log) {
var ctrl = this;
ctrl.items = items;
ctrl.item = item;
ctrl.item.installedItems = ctrl.item.installedItems || [];
ctrl.querySearch = querySearch;
ctrl.allItems = loadItems(ctrl.items);
ctrl.filterSelected = true;
ctrl.updateInstalledItems = function() {
$log.info('Update....')
$log.log(ctrl.installedItems);
ctrl.item.$save();
}
/**
* Search for contacts.
*/
function querySearch (query) {
var results = query ?
ctrl.allItems.filter(createFilterFor(query)) : [];
return results;
}
/**
* Create filter function for a query string
*/
function createFilterFor(query) {
var lowercaseQuery = angular.lowercase(query);
return function filterFn(item) {
return (item.alseSn.indexOf(lowercaseQuery) != -1);
};
}
function loadItems(items) {
/*var items = $scope.items */
return items.map(function (c, index) {
var item = {
alseSn: c.alseSn || c,
alseCard: c.alseCard,
installedOn: c.installedOn || null,
image: 'img/items/47/'+c.alseCard+'.jpg' || null
};
return item;
});
}
}
]);
маршрутные инъекции
.when('/settings/:alseSn', {
templateUrl: 'settings.html',
controller: 'ItemChipCtrl as ctrl',
resolve: {
auth: function($location, Auth){
return Auth.$requireAuth().then(function(auth) {
return auth;
},function(error){
$location.path('/login');
});
},
item: function($route, Items, Auth){
return Auth.$requireAuth().then(function(){
return Items.getItem($route.current.params.alseSn).$loaded();
});
},
items: function(Items, Auth){
return Auth.$requireAuth().then(function(){
return Items.all.$loaded();
});
}
}
})