2014-03-26 2 views
2

Я просто пытаюсь получить ценность из своей базы, используя угловые и угловые огни ... с проблемами.

Внутри моего контроллера:

$scope.componentStatus = syncData("components/-JI_JgHxm0TEUEVjADJn/status"); 
console.log($scope.componentStatus); 

Это возвращает объект, который имеет $value в качестве одного из объектов внутри него.

НО, когда я пытаюсь:

console.log($scope.componentStatus.$value); 

Я получаю Undefined как результат.

Любые указатели? Я чувствую, что это должно быть легкой задачей, поэтому я просто что-то пропустил.

Версии использовано
https://cdn.firebase.com/v0/firebase.js
Angularjs - 1.2.7
Angularfire - 0.6.0

Структура данных

components : { 
    "-JI_dFtOxE5k1ZFeZu8a" : { 
     "experience" : "-JJ8jT0oJA3vYOeBNpq5", 
     "name" : "Name of Component", 
     "status" : "-JJ8hQcUb0_ip9Hoqcqq", 
     "theme" : "-JJ8mD9tEsBw3a3g9Wz6" 
    }, 
} 
+1

' $ value' упоминается в справочном руководстве https://www.firebase.com/docs/angular/reference.html в разделе о конструкторе. – Mikke

+0

@Mikke документы хороши, но это не объясняет, почему мы получаем 'undefined' в качестве результата. – glifchits

+0

Значение $ определяется только для примитивов. Является ли статус примитивным? Сам объект $ firebase содержит ключи для любых дочерних записей (если это объект). Нам нужно немного больше информации о версиях, структуре данных и коде, чтобы воспроизвести/проверить это и действительно понять вопрос. – Kato

ответ

1

Это простое недоразумение асинхронных процессов. В то время, когда вы вызываете $value, данные еще не были получены с сервера.

Попробуйте вызвать это внутри $ на («загруженных», ...) обратный вызов:

$scope.componentStatus = syncData("components/-JI_JgHxm0TEUEVjADJn/status"); 
$scope.componentStatus.$on('loaded', function() { 
    console.log($scope.componentStatus.$value); 
}); 

Обратите внимание, что если то, что вы на самом деле пытаетесь сделать, это отобразить это в DOM, нет необходимости беспокоиться о том, когда данные поступают - Firebase и Угловое будет работать его самостоятельно:

<div>When it arrives, it will appear here: {{componentStatus.$value}}</div> 

Вот скрипка демонстрирует эти понятия: http://jsfiddle.net/katowulf/e7WFf/

И еще показывает ту же самую идею с $ безвыходным: http://jsfiddle.net/katowulf/4J356/

По angularFire 0.8.0, вы также будете иметь возможность лечить $firebase объект как обещание что-то похожее на это:

var data = syncData("components/-JI_JgHxm0TEUEVjADJn/status").then(function() { 
    console.log(data.$value); 
}); 
+0

Спасибо, Като. Это определенно было. В моем случае использования мне не нужно было просто отображать значение, но затем нужно было перебросить его в функцию, чтобы вернуть другое значение. В любом случае, мое зависание было асинхронной концепцией. Ура! – AdamSchnaare

+0

В этом случае, вероятно, нет причин назначать его переменной области видимости. Вы можете просто ссылаться на него локально с чем-то вроде var componentStatus().Также обновленный ответ для 0.8.0 – Kato

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