Poniższy kontroler przesyła widok z tabelą i formularzem. Istotna część tabeli jest:AngularFire nie aktualizuje Firebase czasami
<tr ng-repeat="obj in tab.col | filter:filterObj" ng-click="select(obj)" ng-class="isSelected(obj)">
Jeśli wiersz zostanie kliknięty, forma wyświetla szczegóły OBJ (jego model jest tab.obj) i można go edytować. Tabela otrzymuje aktualizację, gdy użytkownik modyfikuje obiekt w polach formularza, ale firebase nie otrzymuje żadnych aktualizacji, ale dodaje nowe obiekty (odbywa się to za pomocą array.push (obj)).
define(['app'], function(app) {
app.controller('LinksCtrl',['$scope', '$filter', '$http','angularFire','angularFireAuth', function($scope,$filter,$http, angularFire, angularFireAuth) {
$scope.links = {};
$scope.tabs = [];
var url = "https://<url>.firebaseio.com/links";
angularFireAuth.initialize(url, {scope: $scope, name: "user", path: "/"});
var promise = angularFire(url, $scope, 'links', {})
$scope.select = function (item) {
for(i in $scope.tabs) {
var tab = $scope.tabs[i];
if (tab.active) {
tab.obj = item;
if (tab.obj.selected) {
tab.obj.selected = ! tab.obj.selected;
} else {
tab.obj.selected = true;
// $scope.$apply();
}
}
}
};
$scope.isSelected = function(obj) {
if (obj.selected && obj.selected === true) {
return "active";
}
return "";
}
promise.then(function() {
$scope.tabs.push({
title: 'links',
disabled: false,
active: false,
col: $scope.links.open, //this is an array of objects
obj: {}
});
$scope.tabs[0].active = true;
for(i in $scope.tabs) {
var tab = $scope.tabs[i];
tab.actions = app.actions();
// app.actions returns an array with more objects like the following doing CRUD and other basic stuff
tab.actions.push({
name: 'Delete link',
icon: 'icon-minus',
cond: function(tab) { if ('selected' in tab.obj) { return tab.obj.selected}; return false; },
func: function(tab) {
// splice tab.col or whatever modification
}
});
};
});
}]);
});
Jak mogę zrobić coś takiego? czy należy przejść do ręcznej synchronizacji za pośrednictwem kolekcji? debugowanie za pomocą console.log pokazuje, że obiekt obj ma to, co powinien mieć na wszystkich etapach kodu (ma prototyp, kod skrótu, itp.), to tylko, że baza ogniowa nie otrzymuje aktualizacji.
Aktualizacja:
Mam rozwiązanie, które działa. Wygląda na to, że jest to wiążący problem, czy coś takiego, ale nie jestem pewien, co się dzieje. Przypisanie zakładkach [i] = $ scope.links.i .col wygląda sprawcy (w tym przypadku i = 'otwarty': -. ?. To może być moja wykorzystanie kątowe
controller scope ------
// get the firebase data and store it in
var promise = angularFire(url, $scope, 'links', {})
// build the tabs structure, where tabs[i].col = $scope.links.i
// build actions for each tab
// create an empty tabs[i].obj to use in the form model
ng-repeat scope -------
// iterate over the tab structure
<tab ng-repeat="tab in tabs" heading="{{tab.title}}" active="tab.active" disabled="tab.disabled">
ng-repeat scope --------
// Iterate over the elements, so we can select one, and edit it, updating firebase
// If we iterate over tab.col, firebase does not get the updates, but If we iterate over
// the original $scope.links variable, it works as expected
<tr ng-repeat="obj in links[tab.title] | filter:filterObj | orderBy: 'date':true" ng-click="select(obj)" ng-class="isSelected(obj)">
Wydaje się, że jest to problem wiążący, biorąc pod uwagę taniec zakresów dwóch zagnieżdżonych powtórzeń ng w widoku. Ale wszystkie elementy są obiektami i powinny działać: -? [link] (https://github.com/angular/angular.js/wiki/Understanding-Scopes) –
Graty za znalezienie rozwiązania! Czy możesz skopiować swoje rozwiązanie do odpowiedzi poniżej? Ułatwia to przyszłym użytkownikom znalezienie go :) – mimming