2014-01-23 2 views
1

У меня есть контроллер и фабрика для обработки списков. Контроллер должен получить списки, загруженные фабрикой, и отобразить их в представлении. Я не могу иметь метод getLists() на заводе, потому что он должен асинхронно загружаться из FireBase. Вот мой контроллер код-Угловые асинхронные вызовы - обновляющий контроллер?

angular.module('myApp.controllers', []). 
    controller('ListCtrl', ["$scope","listFactory", function($scope, ListFactory) { 
    $scope.lists = []; 

    $scope.$on("list_update", function(snapshot) 
    { 
     console.log(snapshot); 
    }); 

    }]). 
    controller("EditListCtrl", ["$scope","listFactory", function($scope, ListFactory) 
    { 
     $scope.name = ""; 
     $scope.items = []; 
     $scope.itemCount = 10; 

     $scope.save = function() 
     { 
      var List = {"items":[]}; 
      for(var i = 0; i < $scope.itemCount; i++) 
      { 
       var item = $scope.items[i]; 
       if(item != null) 
       { 
        List.items.push(item); 
       } 
       else 
       { 
        alert("Please fill all items of the list."); 
        return false; 
       } 

       ListFactory.putList(List); 
       $scope.items = []; 
       $scope.name = ""; 
      } 
     } 
    }]); 

listFactory выглядит this-

angular.module("myApp.factories", []) 
    .factory("listFactory", [function() 
    { 
     var lists = [{"name":"test"}]; 
     var ListRef = new Firebase("https://listapp.firebaseio.com/"); 

     var factory = {}; 
     factory.getLists = function() 
     { 
      // this won't work 
     } 

     factory.putList = function(List) 
     { 
      ListRef.child("lists").push(List); 
     } 

     ListRef.on("child_added", function(snapshot) 
     { 
      // How do I get this back to the controller??? 
     }); 

     return factory; 
    }]); 

ListRef направит в «child_added» событие, где снимок аргумент содержит данные списка. Мне нужно как-то вернуть его к контроллеру. Я хотел бы сделать это с помощью событий, но я не уверен, как это сделать между фабрикой и контроллером. Я не хочу использовать корневую область, потому что я думаю, что это плохая практика.

Я новичок в этом - любая помощь будет оценена!

ответ

1

Сначала обновить список переменную, чтобы иметь контейнер объекта:

var lists = { items: [{ name: 'test' }] }; 

Затем разоблачить доступ к списку через фабрику, например:

factory.getLists = function() { 
    return lists; 
} 

Затем установите области видимости вар в контроллере:

$scope.lists = ListFactory.getLists(); 

Тогда всякий раз, когда child_added событие срабатывает, обновить список s.items, и $scope от контроллера должен отражать изменения.

+1

effing magic ... –

+0

Я также рекомендую вам ознакомиться с этим: http://jimhoskins.com/2012/12/14/nested-scopes-in-angularjs.html –

+0

Хорошо, что это работает, но только если Я начинаю манипулировать просмотром. Когда страница загружается, он должен вытащить 2 списка, но это происходит только тогда, когда я начинаю вводить текст в одном из полей ввода. Любая идея почему? –