Использование ng-grid с angularFire — ключевые проблемы с именами

Я немного поиграл с этим сейчас, но не могу понять:

(Используя angular 1.2.2, angularFire 0.5.0 и последнюю версию ng-grid)

Итак, у меня есть firebase, и я использую angularFire для извлечения своих данных в компонент ng-grid следующим образом:

//First I go get my data, in this case something called 'grades' from ..../db/grades
    var promise = angularFire(new Firebase($scope.fireBaseUrl), $scope, 'grades');
//When they're fetched I start up a watcher
    promise.then(function(grades) {
    startWatchGrade($scope, filterFilter, appSettings);
});

//Then I bind that grades as a datasource to my ng-grid
$scope.gridOptions = { 
data: 'grades',
enableCellSelection: false,
enableRowSelection: true,
etc....,

Отлично работает, и я сделал элементы управления, которые добавляют новые элементы в «оценки» (push) и удаляют элементы (splice), и все довольно хорошо отражается в ng-grid. Вот так:

//Adding new like this is ok
$scope.grades.push({some-new-data-here});

//Deleting old like this is ok
$scope.grades.splice(row.rowIndex, 1);

Но этот подход автоматически генерирует ключи на основе int для firebase, которые постоянно меняются при изменении, поэтому я хотел получить контроль над ключами, поэтому я изменил добавление элементов для использования вместо этого:

var fbRef = new Firebase($scope.fireBaseUrl);
var newRef = fbRef.push({some-items-here});

И все работает нормально, сохраняя данные в firebase с моими нецелочисленными идентификаторами, но больше не привязывается к ng-grid. Сброс «оценок» в консоль показывает все возвращаемые строки, но не отображается в ng-grid.

Итак, в двух словах: индекс на основе целых чисел, сгенерированный angularFire, работает нормально в ng-grid, а пользовательский буквенно-цифровой, созданный firebase.push, - нет.

Надеюсь, это не звучит слишком загадочно. Думал сделать скрипку, но будем надеяться, что это какая-то «ошибка», которую я упустил из виду и которую легко решить. Если нет, то я попытаюсь залатать один.

Спасибо!


person Timo Wallenius    schedule 03.12.2013    source источник
comment
версии angular/angularFire? Подсказка: 1.2+ имеет гораздо лучшую проверку на равенство. Кроме того, попробуйте здесь использовать angularFireCollection, вам, вероятно, больше повезет с обновляемым массивом (коллекция), а не с объектом, который заменяется при обновлении (angularFire).   -  person Kato    schedule 03.12.2013
comment
Спасибо, в следующий раз попробую, когда буду в своей среде разработки.   -  person Timo Wallenius    schedule 04.12.2013
comment
Не повезло, скрипка была бы идеальной.   -  person Timo Wallenius    schedule 14.12.2013
comment
Привет, Тим, проверьте angularFire-seed тег 0.3 для примеров 0.3 angularFire и angularFireCollection или последний выпуск для примеров $firebase.   -  person Kato    schedule 15.12.2013
comment
Может быть, я, но я полностью упускаю, как вы привязываетесь к своей модели «оценок» во втором подходе?   -  person AardVark71    schedule 17.12.2013
comment
у меня та же проблема, и я проверил, что если я изменю все свои идентификаторы на простые целые числа (вместо автоматически сгенерированных ключей firebase, например, «-JB00ZLshXNv8TfQQcY3»), то ng-grid работает нормально   -  person realgt    schedule 17.12.2013


Ответы (1)


Согласно документации, $firebase всегда возвращает объекты, а не массивы, которые не так хорошо работает с ng-grid. В этом случае angularfire предоставляет фильтр orderByPriority. Обязательно внедрите $filter в свой контроллер.

(Примечание: я не использовал промисы или наблюдатели, только встроенные события с angularfire)

$scope.grades = $firebase(new Firebase($scope.fireBaseUrl));
$scope.gradesData=[];
$scope.gridOptions = { data: 'gradesData'}
$scope.grades.$on("loaded", function(data) {
    var arrData = $filter("orderByPriority")(data);
    $scope.$apply(function(){$scope.gradesData = arrData;});
});

Вы можете попробовать аналогичный подход для $on.('change'...) для новых строк.

надеюсь, это поможет

person realgt    schedule 17.12.2013
comment
Возникли проблемы с пониманием того, как это работает с «загруженным» событием... Похоже, что обратный вызов - это не сами данные, а просто ключ элемента, который был либо добавлен, либо изменен (без указания того, что это было AFAIK). Любые идеи о том, как лучше всего поддерживать двустороннюю привязку между сервисом AngularFire и ng-grid? - person JJ Geewax; 13.04.2014