Я пытаюсь реализовать представление списка. Список создается с помощью $firebaseArray(ref)
. Когда элемент в списке щелкнут, контроллер списка использует list.$getRecord(item.$id)
, чтобы получить конкретную запись. Помещает его в глобальную службу (просто и пустой объект с помощью set и get), а в моем контроллере подробностей я назначаю эту службу (уже установленную для выбранного элемента) переменной области в контроллере подробностей и отображать ее.
Информация в подробном виде доступна для редактирования. и когда он Editted, сохранение данных появляется кнопка, которая при нажатии экономит правку, используя этот код
item = editItem; //editItem contains the new changes made on the detail page
list.$save(item).then(function(ref){
//ref.key() === item.$id; //
console.log("Your Edit has been saved');
});
Это работает. Изменения внесены в данные удаленной базы данных.
Но проблема возникает, когда я перехожу назад в представление списка и пытаюсь щелкнуть другой элемент. Он получает ошибку, которая говорит, что list.$getRecord()
не является функцией. Теперь эта ошибка не возникает, если вы не сохраняете редактирование в представлении деталей.
Я распечатал массив списка до и после того, как я сохранить и я понял, что это
массива List до пункта сохраненный (содержит AngularFire методы) массив
Списка после детали не Сохраненный (больше не содержит AngularFire методы)
Я понятия не имею, почему $ firebaseArray реагирует это W ау. Есть что-то, чего я не вижу? это нормальное поведение? PS: Я использую ионный и угловой огонь.
я могу разместить больше кода если есть необходимость
РЕДАКТИРОВАТЬ Вот абстракция кода
list.html
<ion-list>
<ion-item href="#/lead/info" ng-click="vm.selectItem(l.$id)" ng-repeat="l in vm.list" >
<h3>{{l.firstName}} {{l.lastName}}</h3>
<h4 class="">
<p>{{l.topic}}</p>
</h4>
</ion-item>
</ion-list>
list.js (функция управления)
function ListCtrl(selectedItem, $firebaseArray) {
/* jshint validthis: true */
var vm = this;
vm.list= {};
vm.selectItem = selectItem;
loadList(); //Loads the List array
function loadList() {
var fireList = new Firebase("https://xxxxx.firebaseio.com/list");
var r = $firebaseArray(fireList);
r.$loaded(function() {
vm.list = r;
});
console.log(vm.list); //Outputs the first image(above). But after an item edit and i go back, outputs the second image(above)
}
function selectItem(index) {
var sItem = vm.list.$getRecord(index);
selectedItem.setList(vm.list);
selectedItem.setItem(sItem);
}
}
Сервис selectedItem
прост. я использовать его, чтобы установить единый объект или массив объектов
function selectedItem() {
var sItem = {};
var List = {};
return {
getItem: function() {
return sItem;
},
setItem: function (authObject) {
sItem = authObject;
},
getList: function(){
return List;
},
setList: function(al){
List = al;
}
};
};
Деталь вид контроллер осла так:
item.js (функция контроллера)
function ItemCtrl(selectedItem, $scope, $firebaseObject) {
/* jshint validthis: true */
var vm = this;
$scope.selectedItem = selectedItem.getItem();
$scope.listArray = selectedItem.getList();
//vm.item = $scope.selectedItem;
function saveEdit() {
var t = $scope.selectedItem;
$scope.listArray.$save(t).then(function(ref){
//console.log(ref);
});
}
};
ОБНОВЛЕНИЕ
После серьезного перекрестного контроля на протяжении всего моего кода я понял, что проблема не в массиве AngularFiire. Даже обходное решение, которое я делал с r.$watch
и r.$loaded
, было ненужным. потребность в работе вокруг была причиной другой частью моего кода, я не думал, что это имеет значение. Приносим извинения за ошибку.Я бы удалить этот вопрос и связанный с ним один скоро
Да, во-первых, это listView. $ GetRecord(). Таким образом, listView.getRecord() не будет функционировать правильно. Кроме того, нам понадобится [mcve] (http://stackoverflow.com/help/mcve), чтобы помочь вам в сложной проблеме, такой как непреднамеренная мутация экземпляров. – Kato
Показать еще код. – Chrillewoodz
@kato это была опечатка. я включил некоторый код –