【问题标题】:Injection of angularFireCollection into angular.js config for usage in resolve将 angularFireCollection 注入 angular.js 配置以用于解析
【发布时间】:2013-07-10 11:13:30
【问题描述】:

我最近一直在尝试使用 Angular.js。作为其中的一部分,我创建了一组非常简单的控制器,其中包含 ng-view 和模板,以根据请求的路由进行触发。我使用 angularFireCollection 只是为了从 Firebase 中获取一个数组。这在不构成 ng-view 的 thumbnailController 中工作正常。

我的问题是除了流入thumbnailController的数据外,我还需要另外两个控制器才能访问数据。我最初只是将数据设置为 $rootScope 的一部分或将 ng-view 作为设置 thumbnailController 的 div 的子级。

但是,从这个角度来看,问题在于每个子控制器可能会尝试在模板中设置数据,然后才能从 Firebase 实际获得数据。

该解决方案似乎正在使用解决此问题angularFire route resolution 的答案。但是,使用下面的代码(并且还引用 angularFireCollection)我收到 angularFire 是未知提供者的错误消息。我的理解是下面的代码应该足够了,我还要补充一点,正如我所说,thumbnailController 中 angularFireCollection 的使用效果很好。

我还尝试使用 .$inject 将 angularFire/aFCollection 直接注入控制器,但是在它被视为未知提供者方面出现了类似的问题。

如果可能的话,有人可以就这里可能出现的问题提出建议吗?

var galleryModule = angular.module('galleryModule', ['firebase']);

galleryModule.config(['$routeProvider', 'angularFire', function($routeProvider,  angularFire){
$routeProvider.
    when('/', {
        controller: initialController,
        templateUrl: 'largeimagetemplate.html',
        resolve: {images: angularFire('https://mbg.firebaseio.com/images')}
    }).
    when('/view/:id', {
        controller: mainimageController,
        templateUrl: 'largeimagetemplate.html',
        resolve: {images: angularFire('https://mbg.firebaseio.com/images')}
    }).
    otherwise({
        redirectTo: '/'
});
}]);

galleryModule.controller('thumbnailController', ['$scope', 'angularFireCollection',       function($scope, angularFireCollection){
    var url = 'https://mbg.firebaseio.com/images';
    $scope.images = angularFireCollection(url);
}]);

function initialController($scope,images){
    $scope.largeurl = images[0].largeurl;
}


function mainimageController($scope, images, $routeParams){
  $scope.largeurl = images[$routeParams.id].largeurl;
}

【问题讨论】:

    标签: angularjs angularfire


    【解决方案1】:

    我有机会对此进行了深入研究 - 似乎常规服务不能在 .config 部分中使用。我会在控制器中实例化 angularFire 而不是使用解析,例如:

    galleryModule
    .value("url", "https://mbg.firebaseio.com/images")
    .controller('thumbnailController', ['$scope', 'angularFireCollection', 'url',
        function($scope, angularFireCollection, url) {
            $scope.images = angularFireCollection(url);
        }])
    .controller('initialController', ['$scope', 'angularFire', 'url',
        function($scope, angularFire, url) {
            angularFire(url, $scope, 'images').then(function() {
                $scope.largeurl = $scope.images[0].largeurl;
            });
        }])
    .controller('mainimageController', ['$scope', 'angularFire', '$routeParams', 'url',
        function($scope, angularFire, $routeParams, url){
            angularFire(url, $scope, 'images').then(function() {
                $scope.largeurl = $scope.images[$routeParams.id].largeurl;
            });
        }]);
    

    这并非没有效率,因为 Firebase 仅从 URL 加载一次数据,并且所有后续承诺几乎都会立即使用手头的数据解决。

    不过,我希望看到 angularFire 在 $routeProvider 中与 resolve 一起工作。在我们找到更优雅的解决方案之前,您可以使用此方法作为解决方法。

    【讨论】:

    • 我认为这应该是一种解决方法,但是,我的理解(这可能是错误的)是控制器只有在被定义为单独的函数时才能在 routeProvider 机制中被识别。使用上述方法会导致我收到一条错误消息(但这可能是由于我的等级业余,所以我接受了您的回答并且非常有义务查看这个)。将关注 AF 的进展并感谢您提供出色的产品。
    • 你得到什么错误?上面的代码通常应该可以工作(如果不完全正确,我实际上并没有运行它)。如果找不到原因,请务必回帖!
    • 您好,谢谢您的回复。我得到'initialController 不是从galleryModule 定义的'。也许路由器在控制器模块实例化有问题的控制器之前就使用了initialController?如果术语不正确,我们深表歉意。
    • 啊,当使用 .controller 形式定义控制器时,您必须根据stackoverflow.com/questions/11211999/… 的答案将它们标识为路由器中的字符串 - 现在一切正常!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多