我目前正在尝试这种模式,虽然不是DCI,但它提供了经典的服务/模型解耦(具有用于与Web服务通信的服务(也称为模型CRUD),以及定义对象属性和方法的模型)。
请注意,只有当模型对象需要处理其自身属性的方法时,我才使用此模式,我可能会在任何地方使用(例如改进的getter/setters)。我并不是主张系统地为每项服务都这样做。
编辑:我曾经认为这种模式会违背“Angular模型是普通的旧javascript对象”的口头禅,但现在在我看来,这种模式是完全可以的。
编辑(2):为了更清楚,我只使用Model类来分解简单的getters/setters(例如:在视图模板中使用)。对于大型业务逻辑,我建议使用“了解”模型的单独服务,但与它们分开,并且仅包含业务逻辑。如果需要,可以将其称为“业务专家”服务层
service/ElementServices.js(注意元素是如何在声明中注入的)
MyApp.service('ElementServices', function($http, $q, Element)
{
this.getById = function(id)
{
return $http.get('/element/' + id).then(
function(response)
{
//this is where the Element model is used
return new Element(response.data);
},
function(response)
{
return $q.reject(response.data.error);
}
);
};
... other CRUD methods
}
model/Element.js(使用angularjs Factory,用于对象创建)
MyApp.factory('Element', function()
{
var Element = function(data) {
//set defaults properties and functions
angular.extend(this, {
id:null,
collection1:[],
collection2:[],
status:'NEW',
//... other properties
//dummy isNew function that would work on two properties to harden code
isNew:function(){
return (this.status=='NEW' || this.id == null);
}
});
angular.extend(this, data);
};
return Element;
});