我在模块中有这个配置和控制器:
(function () {
"use strict";
angular.module("dashboard", ["ui.router",
"clients",
"sites",
"regions",
"beddingTypes",
"geomindCommon",
])
.config([
"$stateProvider",
function ($stateProvider) {
$stateProvider
.state("home", {
url: "/Menu",
templateUrl: "app/dashboard/templates/dashboard.tmpl.html",
resolve: {
client: ['$window', 'dashboardService', 'config', clientMapResolver],
}
});
}
])
.controller('dashboardController', ['$scope', 'config',
function ($scope, config) {
$scope.currClientId = config.currClient.id;
}
])
function clientMapResolver($window, dashboardService, config) {
var layoutId = $window.parent.parent.parent.location.search.split('=')[1];
}
})();
如您所见,我已在config
州定义了解决方案。
但决不会被触发,永远不会调用clientMapResolver
函数。
更新 也许这会导致问题:
项目是SPA项目。仪表板是主要模块。 我注意到在我的索引页面中我有这样的说法:
<body ng-app="dashboard" ng-strict-di>
<div ng-controller="dashboardController">
<div class="sizeResponsive navbar navbar-green navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
</div>
</div>
</div>
任何想法为什么决不会被触发?
答案 0 :(得分:1)
您可以调用类似的函数;
url: "/home",
templateUrl: "home.html",
controller: "dashboardController",
resolve:
{ fooList: function (fooResolver)
{
//Your Codes
return fooResolver.getList();
}
}
如果您希望Service-Factory可能是这样的话;
app.factory("fooResolver", function () {
this.getList= function () {
return [{name:"foo"}]
}
});
答案 1 :(得分:0)
您的问题是您的resolve
数据块未映射到正确的数据类型。解析块的目的是为与该视图关联的控制器定义依赖关系。您没有在此代码中声明您的控制器 - 您需要定义一个与该解析相关联的控制器(请参阅the documentation)。完成此操作后,应将解决方案用于应用中未在其他位置定义的任何服务。所以你不需要解决&#34; $ window&#34;或类似的东西,只是已经存在的特殊价值观。因此"client"
将是注入到您的控件中的依赖项的名称(匹配字符串&#34;客户端&#34;)以及与&#34;客户端&#34;相关联的值。被注入的是什么。因此,它需要映射到字符串(现有服务的名称)或将返回要注入的值的函数。请参阅文档:https://github.com/angular-ui/ui-router/wiki#resolve。
请注意,我也会劝阻任何类似于$window.parent.parent.parent.location.search
的内容。如果你需要这样做,你真的有太多的iframe。
答案 2 :(得分:0)
我同意@Maher,并且在问题中有许多未知的细节(dependencies
),这使得难以调试。我继续简化@ 31piy提供的plunkr,让你明白问题所在。你说你的解决功能不起作用。虽然您的代码看起来很好,但我怀疑其他方面有问题。您可以尝试删除所有依赖项,使其适用于简单的场景并从那里构建。
任何想法为什么决不会被触发?
以下是使用您的代码触发解析功能的plunkr链接。现在继续逐个添加您的依赖项,以了解导致问题的确切原因。
这是简化代码的样子,
(function() {
"use strict";
angular.module('dashboard', ['ui.router'])
.config(["$stateProvider", function($stateProvider) {
var helloState = {
name: 'home',
url: '/Menu',
templateUrl: 'dashboard.tmpl.html',
resolve: {
client: [clientMapResolver]
}
}
var aboutState = {
name: 'about',
url: '/about',
template: '<h3>Its the UI-Router hello world app!</h3>'
}
$stateProvider.state(helloState);
$stateProvider.state(aboutState);
}]).controller('dashboardController', ['$scope',
function ($scope) {
console.log('Controller activated');
}
]);
function clientMapResolver() {
alert("I was inside clientMapResolver");
}
})();
以下是一些链接,可以阅读有关resolve
的更多信息,以便您可以正确使用它们,希望这会有所帮助:
我看到了你的编辑,但仍然很难看出resolve
无法解雇的原因。从您的代码中疯狂猜测,我只能说,只有当您访问clientMapResolver
路由时,才会触发您的解析函数home
(网址将为/Menu
)。为了实现这一点,我不知道你在哪里注入你的观点(<ui-view></ui-view>
)。
就像我说的那样,你应该删除/注释掉大部分内容并检查基础案例并从那里开始构建,请确认你已经使用<ui-view></ui-view>
注入了你的视图,这样你的路由器就知道了注入视图的位置并触发resolve
。
答案 3 :(得分:0)
嗯,你的代码对我来说似乎很合适。有些观点似乎是罪魁祸首,但总的来说,它们不应该导致resolve
出现任何问题。
根据现有答案和您的代码,我的观察结果如下:
我发现resolve
函数中只有一个属性,即client
。这进一步取决于3个组件。如果在解析client
时没有解决任何依赖关系,那么控制台上应该有错误,我认为这不是问题,因为您还没有报告任何控制台错误。
除此之外,UI路由器的文档还定义了resolve
中的简单函数将立即解决。因此,clientMapResolver
不应该导致任何问题。它是一个简单的JavaScript函数,因此UI路由器将立即解决它。
虽然这是一个非常小的问题,但是诸如JSLint或ESLint之类的内容可能会引发错误并阻止在这种情况下编译代码。观察相关配置(如果有)。这行末尾有一个逗号:
client: ['$window', 'dashboardService', 'config', clientMapResolver],
删除它,然后重试。
由于没有足够的信息来提供确切的解决方案,我最可能的猜测是为UI路由器的状态注册错误监听器,并观察它。如果UI路由器在访问状态时遇到任何问题,则会广播$stateChangeError
。
你可以尝试听下面的内容:
angular.module("dashboard", [ ... ])
.run(['$rootScope', function($rootScope) {
$rootScope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) {
console.log(event, toState, toParams, fromState, fromParams);
console.error(error);
});
})
.config( ... )
// Your other code
当访问它时,它会在控制台上打印出错误路径的痕迹。
答案 4 :(得分:-1)
Resolve 是可以在控制器中注入的,所以Resolve需要返回一些东西来获取值或任何东西......
您也可以直接使用服务功能将解析返回值设为承诺,在这种情况下,您无需在
中添加功能app.config
我们必须使用解决?
有时我们需要确保在Controllers
或Views
等中绑定主题之前有一些数据,在这种情况下,我们使用resolve来收集所有数据,然后再将它们呈现在其他地方。
如果您在控制台中一无所获,请确保网址是正确的,在此示例中我将
/Menu
更改为/home
,因此在网址中我localhost/#/home
< / p>
var app = angular.module("dashboard", ["ui.router"]);
app.config(["$stateProvider", "$urlRouterProvider", function ($stateProvider, urlRouterProvider) {
urlRouterProvider.otherwise("home");
$stateProvider.state("home", {
url: "/home",
templateUrl: "home.html",
controller: "dashboardController",
resolve: {
client: ["service", clientMapResolver],
}
});
function clientMapResolver(service) {
return service.callMe();
}
}
]);
app.controller("dashboardController", function (client) {
console.log(client);
})
app.service("service", function () {
this.callMe = function () {
//var layoutId = $window.parent.parent.parent.location.search.split('=')[1];
var layoutId = "123",
return layoutId;
}
});
请在投票前免费提问我