2016-11-10 3 views
6

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

this.af.database.list('users').push(user); 

Как я могу сделать ключ объекта, который представляется настраиваемым. Итак, я хочу, чтобы у узла этого объекта был тот же uid зарегистрированного пользователя. У меня есть доступ к этому идентификатору. Мне просто нужно знать, как заставить пользовательский объект объектов не быть автоматически сгенерированным идентификатором при нажатии.

Благодаря

ответ

0

Просто сделай это с обычным firebase способом, как это:

var updates = {}; 
    updates['/users/' + userId] = newUserData; 

return firebase.database().ref().update(updates); 

Все, что в вашей области, которая привязывается к вашему списку будет отражать обновление.

Read and Write Data on the Web

+1

.ref, похоже, устарел до июля 2017 года. – Preston

+0

Можете ли вы уточнить? – ksav

+0

ksav - Я читал, что .ref устарел, но не имеет источников. Проверьте документы и выполните поиск в Интернете. – Preston

9

Используйте метод, как показано ниже с Angularfire2

addCustomKey (key, value) { 
    const toSend = this.af.database.object(`/users/${key}`); 
    toSend.set(value); 
} 
+0

По состоянию на дату моего комментария этот подход устраняет ошибки из-за/$ {key}. Я заменил его на переменную, но я добавил свой собственный ключ в качестве значения для узла. – Preston

+0

Это больше не работает с новейшей версией углового огня ... – Spacemoose

+0

Спасибо. Он работал для меня, используя firebase2 4.0.0 – Thisisalexis

4

Вот еще один метод, который можно использовать с AngularFire2

addCustomKey(key, value) { 
    const users = this.af.database.object('/users'); 
    users.update({ [key]: value }); 
} 
1

ваниль JS выглядит примерно так:

//to generate a key do something like 
var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 
    return v.toString(16); 
}); 

function setNode(key){ 
    if (key){ 
    var thisRef = ref.child('testLocation'); 
    var obj = {}; 
    obj[key] = true; 
    thisRef.update(obj, onComplete); 
    } 
} 
2

push добавит кнопочный ключ, просто использовать update метод:

this.yourRef = this.af.database.list('users'); 
let userId = "UID", 
userInfos = { data: "your user datas" }; 

this.yourRef.update(userId, userInfos); 
+0

Не знаете, как вы можете обновить то, что еще не имеет ключа. Начиная с этой даты это не выполняется с ошибкой: Первый аргумент должен быть объектом, содержащим заменяемых детей. – Preston

+0

это не работает. – Spacemoose

1

Pass в пользовательском ключе, в этом случае projectKey, который является переменной вы заселить откуда-то:

private whatEverName(projectKey) { 
    this.projectKey = projectKey; 
    this.af.object('/Projects/' + this.projectKey); 
} 

вызова whatEverName (projectKey) в вашем коде где-нибудь, и у вас есть пользовательский ключ узла. Этот совет действует по состоянию на 25 июля 2017 года.

Я добавил здесь немного больше, чтобы помочь тем, кто пытается создать дочерний узел, выше, с другим клавишей в качестве настраиваемого ключа. Это полезно для индекса ассоциации в рамках этого проекта, такого как список пользователей, работающих над этим проектом. Возможно, вам не нужен этот список в данных проекта, но получите его по запросу. Это упрощает денормализацию данных и имеет более плоскую архитектуру, цель Firebase.

Этот узел ассоциации называется ProjectsMembers в этом случае, и мы записываем в него владельца проекта. Добавьте другие пользовательские узлы таким же образом. Обратите внимание на backticks !!! Одиночные кавычки не будут работать. В этом случае я установил имя владельца в качестве ссылки на клавишу нажатия. Легче читать в дБ.

// Add child node with project key as push key to the association index. 
this.af.object(`ProjectsMembers/${projectKey}/` + this.ownerKey) 
    .set({ ownerName: this.ownerName });