Angular - 组织控制器、工厂和 "class"

Angular - Organise controller, factory and "class"

我想了解如何在我的 angular 项目中进行良好的组织。

[见下面的代码]

将 getFireList 函数放入工厂是否有意义?还是我应该把它放到控制器里?

"class"火有意义吗?我应该删除它吗?我应该把它移到控制器吗?我应该把它搬到工厂吗?

如果您发现此代码中有任何错误,我真的很想了解更多信息。

现在,我知道了:

A class "Fire" 创建 Fire 类型的新对象。

function Fire (p_power) {
    // ATTRIBUTES
        this.id = null;
        this.power = p_power;
        this.position  = {
            x: null,
            y: null
        }

    // GETTERS/SETTERS
        // id
        this.getId = function() {
            return this.id;
        }
        this.setId = function(p_id) {
            this.id = p_id;
        }

        // power
        this.getPower = function() {
            return this.power;
        }
        this.setPower = function(p_power) {
            this.power = p_power;
        }

        // position
        this.getPosition = function() {
            return this.position;
        }
        this.setPosition = function(p_position) {
            this.position = p_position;
        }

    // METHODS
        this.increasePower = function(p_plus) {
            this.power += p_plus;
        }

        this.decreasePower = function(p_minus) {
            this.power -= p_minus;
        }
    }

一个控制器

    simuApp.controller('FireController', function($scope, FireFactory) {

        // ...

    });

还有一个工厂

    simuApp.factory('FireFactory', function() {

        return {
            fire_list: [],

            getFireList : function() {
                return $http.get(site_url+'fire/fireList').
                then(
                    function(success) {
                        var data = success.data;
                        var fires = [];
                        var fire_tmp;

                        for (i=0 ; i<data.length ; i++) {
                            fire_tmp = new Fire( data[i].power );
                            fire_tmp.setId( data[i].idFire );

                            fires.push( fire_tmp );
                        }

                        fire_list = fires;

                        return fire_list;
                    }, function(err) {
                        // ...
                    }
                );
            }

        }

    });

感谢您的帮助。

首先,让我们弄清楚术语。 .factory 是一种注册生成服务实例的函数的方法 - 因此 "factory"。不过,它生成的是一个单例服务实例。

因此,您创建的服务命名为 FireSvc 更恰当(与 FireFactory 相对),而创建它的函数可以在其中包含单词 "factory" (虽然,在下面的例子中,这个函数名并不是真正需要的——它可以只是一个匿名函数):

.factory("FireSvc", function FireSvcFactory(){

});

使用服务从控制器中抽象出任何 domain/business 逻辑是一种很好的做法。保持控制器精简,仅负责定义 ViewModel,并通过更改 ViewModel 或调用 Model 上的函数来对事件做出反应。

所以,FireSvc.getFireList() 是有道理的。

现在,列表是普通对象的集合,还是 Fire 的实例,完全独立于 Angular,完全取决于您。无论如何,在 SO 答案中讨论这个话题太宽泛了。