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 看起来像这样-

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”事件,其中快照参数具有列表数据。我需要以某种方式将其返回给控制器。我想用事件来做到这一点,但我不确定如何在工厂和控制器之间做到这一点。我不想使用根范围,因为我认为这是不好的做法。

我是新手 - 任何帮助将不胜感激!

4

1 回答 1

1

首先更新您的列表变量以拥有一个容器对象:

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

然后通过工厂公开对列表的访问,例如:

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

然后在你的控制器中设置一个范围变量:

$scope.lists = ListFactory.getLists();

然后每当child_added触发事件时,更新lists.items,并且$scope 来自控制器的应该反映更改。

于 2014-01-23T01:46:14.447 回答