角度 - 组织控制器,工厂和“类”

时间:2015-03-07 14:21:36

标签: angularjs angularjs-scope angularjs-factory

我想了解如何在我的角度项目中建立一个好的组织。

[见下面的代码]

将getFireList函数放入Factory是否有意义?或者我应该把它放进控制器?

"班级"火有道理吗?我应该删除它吗?我应该把它移到控制器吗?我应该把它搬到工厂吗?

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

目前,我已经得到了这个:

课程" 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) {
                        // ...
                    }
                );
            }

        }

    });

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先,我们让术语正确。 .factory是一种注册生成服务实例的函数的方法 - 因此是“工厂”。但它产生的是一个单例服务实例。

因此,您创建的服务将更恰当地命名为FireSvc(而不是FireFactory),而创建它的函数可以在其中包含“factory”(尽管如此)在下面的例子中,该函数名称并不是真正需要的 - 它可能只是一个匿名函数):

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

});

使用服务从控制器中抽象出任何域/业务逻辑是一种很好的做法。保持控制器很薄,仅负责定义ViewModel,并通过更改ViewModel或调用模型上的函数来响应事件。

所以,让FireSvc.getFireList()有意义。

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