2015-08-03 4 views
1

Я пытаюсь реализовать представление списка. Список создается с помощью $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 методы) массив List array before an item is saved

Списка после детали не Сохраненный (больше не содержит AngularFire методы) List array after an item is saved

Я понятия не имею, почему $ 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, было ненужным. потребность в работе вокруг была причиной другой частью моего кода, я не думал, что это имеет значение. Приносим извинения за ошибку.Я бы удалить этот вопрос и связанный с ним один скоро

+0

Да, во-первых, это listView. $ GetRecord(). Таким образом, listView.getRecord() не будет функционировать правильно. Кроме того, нам понадобится [mcve] (http://stackoverflow.com/help/mcve), чтобы помочь вам в сложной проблеме, такой как непреднамеренная мутация экземпляров. – Kato

+0

Показать еще код. – Chrillewoodz

+0

@kato это была опечатка. я включил некоторый код –

ответ

0

Попробуйте использовать Бодрствующий перезагрузить данные:

var fireList = new Firebase("https://xxxxx.firebaseio.com/list"); 
var r = $firebaseArray(fireList); 

r.$watch(function() { 
    r.$loaded(function() { 
    vm.list = r; 
    }); 
}); 

Это обычный способ борьбы с обновлениями в легком пути, может решить вашу проблему ,

+0

ничего себе ... это работает. но я не понимаю, почему. Зачем? –

+0

@ RaymondAtivie Я действительно не знаю себя, извините. Но теперь вы знаете, как избежать этой ошибки, и в этом весь смысл :) Я был бы признателен, если вы примете мой ответ :) – Chrillewoodz

+0

Это не обязательно, честно. Однако большой обходной путь. – Kato

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