我有一个Angular工厂,它只是使用$http
服务从服务器上的静态json文件中获取数据。
module.factory('ShowsProvider', function ($http) {
return {
get: function () {
return $http.get('/static/shows.json');
}
};
});
然后我有一个注入此工厂的控制器,并调用上面定义的get()
方法。
module.controller('RegisterController', ['ShowsProvider', function (ShowsProvider) {
var vm = this;
vm.shows = [];
ShowsProvider.get().then(function (shows) {
vm.shows = shows.data;
});
}]);
这样可行,但在我的控制器中进行自由浮动函数调用会感觉很尴尬。在Angular中是否有某种模式可以更干净地调用此工厂,并将数据提供给我的控制器?或者我有一个“可接受的”方法?
答案 0 :(得分:1)
使用ngRoute或UI路由器时可以处理此问题。路由器负责解包解析器承诺,状态/路由解析器作为已解析的值注入状态/路由控制器。
$routeProvider.when('...', {
resolve: {
showsResolver: (ShowsProvider) => ShowsProvider.get()
},
controller: function (showsResolver) {
this.shows = showsResolver;
}
...
即使在小型应用程序中使用路由器也是其中一个原因。如果这不是一个选项,那么原始方法是在控制器中解包承诺的建议方法。
答案 1 :(得分:1)
当然,调用像你这样的工厂功能是可以接受的。
我通常将这种浮动函数包装在IIFE(立即调用的函数表达式)中。
module.controller('RegisterController', ['ShowsProvider', function (ShowsProvider) {
var vm = this;
vm.shows = [];
(function() {
ShowsProvider.get().then(function (shows) {
vm.shows = shows.data;
});
})();
}]);
控制器加载时执行此IIFE。但是,有时会发生这种情况,我需要再次调用一个自由浮动函数(例如在执行一些ng-click
操作之后)。这就是为什么,我将这个自由浮动函数保存在一个分配给变量的匿名函数中。因此,它可以帮助您在控制器加载时或控制器加载后调用。
module.controller('RegisterController', ['ShowsProvider', function (ShowsProvider) {
var vm = this;
vm.shows = [];
vm.getShows = function() {
ShowsProvider.get().then(function (shows) {
vm.shows = shows.data;
});
}
// suppose some ng-click operation calls this
vm.deleteShow = function(show) {
// suppose a deleteShow function is there in ShowsProvider
ShowsProvider.deleteShow({showId: show.id}).then(function (shows) {
// if you want to retrieve the shows again
vm.getShows();
});
}
(function() {
vm.getShows();
})();
}]);
还有其他一些好的技巧。但是,这一切都归结为对你有利的东西。