Angular JS概念概述。独立于视图的业务逻辑:服务(标题)。 描述说 - 将独立于视图的逻辑从控制器移动到服务中,但代码表示工厂。我在这里缺少什么?
angular.module('finance2', [])
.factory('currencyConverter', function() {
var currencies = ['USD', 'EUR', 'CNY'];
链接到resource
答案 0 :(得分:1)
工厂方法('recipe')是一种创建'服务'的方法。
您还可以使用服务,常量,值和提供商配方('方法')创建'服务'。
无论如何,你最终会实例化一个概念上属于“服务”的对象。
人们普遍承认,这是Angular令人困惑的一个方面。请参阅this classic Stackoverlow question。
开发者指南也很好地澄清了这些概念:
您构建的每个Web应用程序都由协作完成任务的对象组成。这些对象需要实例化并连接在一起才能使应用程序正常工作。在Angular应用程序中,大多数这些对象都是实例化的,并由注入服务自动连接在一起。
注入器创建两种类型的对象,服务和专用对象。
服务是API由开发人员编写服务定义的对象。
专用对象符合特定的Angular框架API。这些对象是控制器,指令,过滤器或动画之一。
注射器需要知道如何创建这些对象。您可以通过注册“配方”来使用注射器创建对象来告诉它。有五种食谱类型。
最详细,但也是最全面的是提供者食谱。其余四种食谱类型 - 价值,工厂,服务和常数 - 只是提供者食谱之上的语法糖。
答案 1 :(得分:1)
来自Java
背景,我非常喜欢角形工厂的概念;我们在某种程度上模仿了POJO。我可以附加有意义的方法并执行模型中自包含的逻辑。对于服务,我倾向于将这些视为我在服务器端处理服务,而仅仅是为了获取数据。
例如,如果我们正在构建某种类型的Twitter克隆,对于推文流,我有TweetSteamFactory
内部使用TweetService
获取数据以获取最新推文。也许我的工厂有一个getNextPage()
方法,它绑定到ngClick
某处 - 当被解雇时,它当然会使用TweetService
进行调用。
无论如何,我确实看到了服务和工厂之间的明显区别,尽管我的理解可能是错误的。
http://plnkr.co/edit/SqPf212nE5GrSPcZdo5K
<强>控制器强>
app.controller('MyController', function(FoobarFactory) {
FoobarFactory()
done(function(factory) {
var factory = factory;
$scope.data = factory.getData();
$scope.baz = factory.getBaz();
})
});
<强>工厂强>
app.factory('FoobarFactory', ['MyService', function(MyService) {
function Foobar() {}; // Empty constructor
angular.extend(Foobar.prototype, {
_init: function() {
var deferred = $.Deferred();
var foobar = this;
this.baz = true;
this.data = undefined;
MyService.getData()
.done(function(data) {
foobar.data = data;
deferred.resolve(foobar);
})
deferred.resolve();
return deferred.promise();
},
getBaz: function() {
return this.baz;
},
getData: function() {
return this.data;
}
});
return function () {
var deferred = $.Deferred();
var foobar = new Foobar();
foobar._init()
.done(function() {
deferred.resolve(foobar);
})
.fail(function(error) {
deferred.reject(error);
});
return deferred.promise();
};
}]);