Angularjs ui路由器中的状态转换和从父抽象状态解析

Angularjs ui路由器中的状态转换和从父抽象状态解析,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我想在Angular ui router应用程序中的状态转换期间显示加载动画 检查以下代码 $stateProvider .state("app", { abstract: true, url: "", template: "<ui-view/>", controller: "appController", controllerAs: "vm", resolve: { result_data_abstract: func

我想在Angular ui router应用程序中的状态转换期间显示加载动画

检查以下代码

$stateProvider
.state("app",
{
    abstract: true,
    url: "",
    template: "<ui-view/>",
    controller: "appController",
    controllerAs: "vm",
    resolve: {
        result_data_abstract: function ($q, $timeout))
        {
            var deferred = $q.defer();
            $timeout(function () {
                deferred.resolve("from abstract");
            }, 500);
            return deferred.promise;
        }
    }
})
.state("app.real",
{
    url: "/real/{id}",
    templateUrl: "somepath/template.html",
    controller: "realController",
    controllerAs: "vm",
    resolve: {
        result_data_real: function ($q, $timeout))
        {
            var deferred = $q.defer();
            $timeout(function () {
                deferred.resolve("from real");
            }, 500);
            return deferred.promise;
        }
    }
}
.state("app.real2",
{
    url: "/real2/{id}",
    templateUrl: "somepath2/template.html",
    controller: "real2Controller",
    controllerAs: "vm",
    // Note no resolve
})
由于具体状态从中继承的抽象状态具有解析,因此我希望每次“
toState.resolve
”都为true,从它继承的抽象父状态获取解析

但事实并非如此——当我加载app.real2时,
toState.resolve
”为空

有什么方法可以让这个工作正常吗?

你正在加载整个“页面”吗?如果是这样的话,我会在run中调用它

app.run(function($rootScope) {

    $rootScope.$on("$stateChangeStart", function () {
        console.log("stateChangeStart");
        showSpinner();
    });

    $rootScope.$on("$viewContentLoaded", function () {
        console.log("stateChangeSuccess");
        hideSpinner();
    });
});

我不使用$stateChangeSuccess和toState,但它看起来也可以工作。

视图转换将是instantaneos。你甚至看不到加载器。也许您想在执行http请求时显示加载程序?我认为此注释^。为什么在显示微调器之前检查分辨率很重要?您可以只显示和隐藏它,如果缓存解析结果,则不会看到微调器(或仅在几毫秒内。您还可以将
参数添加到要显示微调器的特定状态,并选中
toParams.showSpinner
(例如)相反,如果你的决心需要一两秒钟,你就会看到它。
app.run(function($rootScope) {

    $rootScope.$on("$stateChangeStart", function () {
        console.log("stateChangeStart");
        showSpinner();
    });

    $rootScope.$on("$viewContentLoaded", function () {
        console.log("stateChangeSuccess");
        hideSpinner();
    });
});