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 答案中讨论这个话题太宽泛了。
我想了解如何在我的 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 答案中讨论这个话题太宽泛了。