承诺在路由状态更改时不呈现数据 - UI路由器

时间:2016-10-09 03:23:00

标签: javascript angularjs firebase firebase-authentication

例如,家庭路线显示家庭饲料。在初始控制器初始化&在页面上重新加载。 Feed数据在视图中绑定和渲染。

问题:

  • 在以下情况下,数据无法在视图中呈现:

    1. 网站导航中的任何内容 - 例如使用ui-sref('home.feed')
    2. 重定向回state('home.feed')的功能行为。即上传图片功能:

      • 文件输入(选择文件/图像)图像预览添加图片状态
      • 添加图片状态具有上传功能。然后重定向回到主页。

控制器代码

function HomeController(currenAuth, feeds) {
    var vm = this;
    vm.pixData = [];


    ///// Controller activation

    activate();


    function activate() {
        if (currentAuth) {
            getHomeFeed();
        }
    }


    ///// Controller methods

    function getHomeFeed() {
        return feeds.showHomeFeed().then((results) => {
            if (results) {
                hideNoPostsContainer();
                return vm.pixData = results[0];
            }
        });
    }

}
  • vm.pixData用于视图中的ng-repeat

试图找出最佳实践模式。确保呈现数据。

我看到的其他添加选项是:

  1. $ rootscope。$ on('$ statechangesuccess',...
  2. 解析路由配置中的属性
  3. 研究这个问题,没有确切的信息。阅读John Papa的文章route-resolve-and-controller-activate-in-angularjs。在那篇文章中,它提到了使用我正在使用的控制器中的resolve或激活模式。但没有建议同时使用两者。

    更新

    使用resolve属性似乎是明确的方法。

    使用此toddmotto.com/resolve-promises-in-angular-routes/中的模式,到目前为止似乎没有任何障碍,但是您何时想直接在控制器中使用承诺代码?

    不确定为什么你永远不想使用resolve属性?

    路由器配置代码

    .state('home.feed', {
                    url: '',
                    views: {
                        content: {
                            templateUrl: 'app/spaPages/home.html',
                            controller: 'HomeController',
                            controllerAs: 'hc',
                            resolve: {
                                'currentAuth': ['$firebaseAuth', ($firebaseAuth) => {
                                    return $firebaseAuth().$waitForSignIn();
                                }],
                                '_pixData': ['feeds', (feeds) => {
                                    return feeds.showHomeFeed().then((results) => {
                                        if (results) {
                                            console.log('called from router resolve');
                                            return results[0];
                                        }
                                    });
                                }]
                            }
                        }
                    }
                })
    

    控制器代码

    .controller('HomeController', HomeController);
    
    function HomeController(currenAuth, _pixData) {
        var vm = this;
        vm.pixData = _pixData;
    }
    

1 个答案:

答案 0 :(得分:0)

关于无法在路线更改中呈现承诺数据的原始问题的答案

此时可以考虑回答。

使用resolve属性有效。

但仍然想知道最佳模式是什么,或者是最佳实践模式,以实现承诺解决和清晰角度开发。可能会在以后安排这个问题。