在 ui-router 中具有已解析值的 templateProvider
templateProvider with resolved values in ui-router
我真的不能使用父级的已解析值来声明并使用 tempalteProvider 注入子状态吗?我读了一些文章,人们说这是不可能的。解析值在到达控制器之前不可用。我需要一些值来确定我需要加载哪个模板。
你说的确实是真的。但是您可以通过使用服务来规避它。假设您有一个从服务中获取结果的解决方案:
'resolve': {
'myData': ['MyService', function (MyService) {
return MyService.getData();
}]
}
在该服务中,您可以 cache/store 您的结果:
angular.module('app').factory('MyService', ['$http', function ($http) {
var data;
return {
getData: function () {
// No data yet, fetch it
if (!data) {
return $http({method: 'GET', url: 'a.json'}).then(
function (result) {
// Store for future use
data = result.data;
// Return data
return data;
});
// Data already present
} else {
// Return data
return data;
}
}
}
}]);
现在在您的子状态中,您可以使用在您的模板提供程序中准备好数据的服务:
'templateProvider': ['$http', 'MyService', function ($http, MyService) {
var data = MyService.getData();
return $http.get(data.type + '.html').then(
function (response) {
return response.data;
}
);
}]
这是 Plunker 上的一个简单的例子:http://plnkr.co/edit/hUGhmGSowV4XEdXfdS0E?p=preview
我真的不能使用父级的已解析值来声明并使用 tempalteProvider 注入子状态吗?我读了一些文章,人们说这是不可能的。解析值在到达控制器之前不可用。我需要一些值来确定我需要加载哪个模板。
你说的确实是真的。但是您可以通过使用服务来规避它。假设您有一个从服务中获取结果的解决方案:
'resolve': {
'myData': ['MyService', function (MyService) {
return MyService.getData();
}]
}
在该服务中,您可以 cache/store 您的结果:
angular.module('app').factory('MyService', ['$http', function ($http) {
var data;
return {
getData: function () {
// No data yet, fetch it
if (!data) {
return $http({method: 'GET', url: 'a.json'}).then(
function (result) {
// Store for future use
data = result.data;
// Return data
return data;
});
// Data already present
} else {
// Return data
return data;
}
}
}
}]);
现在在您的子状态中,您可以使用在您的模板提供程序中准备好数据的服务:
'templateProvider': ['$http', 'MyService', function ($http, MyService) {
var data = MyService.getData();
return $http.get(data.type + '.html').then(
function (response) {
return response.data;
}
);
}]
这是 Plunker 上的一个简单的例子:http://plnkr.co/edit/hUGhmGSowV4XEdXfdS0E?p=preview