使用工厂数据填充控制器的正确方法?

时间:2016-05-19 14:50:25

标签: angularjs

我有一个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中是否有某种模式可以更干净地调用此工厂,并将数据提供给我的控制器?或者我有一个“可接受的”方法?

2 个答案:

答案 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();
    })();
}]);

还有其他一些好的技巧。但是,这一切都归结为对你有利的东西。