我有一个要求我应该写工厂的要求。该工厂应包含3个函数init,save和delete
我应该从控制器调用init函数。此函数返回一个对象。该对象具有执行添加和删除功能的功能。
我怎样才能实现这一目标?
以下是我的代码,它成功执行了init函数但是当我尝试使用添加或删除时返回的对象时,它说对象是空的
angularApp.factory('SomeFactory', function(){
var client = new Client(); // this client is defined in another javascript file
// this is the object which we should return
var clientReady = function () {
var cv = client.GetVersion();
showIDs();
};
return {
initClient:function(requiredUID){
client.setAttribute("clientReadyCallback",clientReady);
}//,
};
var add = function () {
client.someapi;
};
var delete = function () {
client.someapi;
};`
});
in controller i call the below calls
SomeFactory.initClient("username");
SomeFactory.add();// throws error
我怎样才能实现这个目标?
答案 0 :(得分:19)
首先,您不是返回工厂,而是返回服务。它是一个创建服务的工厂,因此请调整您的命名约定:app.factory('someService'
您的代码很乱并且有错误,因此我将向您展示返回服务对象的基础知识。
app.factory('someService', function() {
var someService = { //build this object however you want
add: function() {
},
save: function() {
}
};
return someService; //return the object
}); //end factory
控制器中的:someService.add();
答案 1 :(得分:3)
工厂和服务实际上是不同的一个简单但非常非常重要的方式。
工厂会返回可能是新的服务
换句话说,你可以这样做:
var instanceOne = new $factory;
var instanceTwo = new $factory;
...然后将它们称为单独的实体。事实上,这就是工厂模式的全部内容。
以下是一个工厂的简单示例,您可以获得...
的副本app.factory('myFactory', function() {
return {
talk: function(what) {
return "Say " + what;
}
}
});
如果您需要服务,则需要通过this.methodName引用其中的方法,然后您只需返回服务本身,或单个模式。像这样......
app.service('myService', function() {
this.talk = function(what) {
return "Say " + what;
};
});
作为旁注;如果你查看我的代码,Angular现在支持通过service关键字或factory关键字实际定义服务。在源代码中,您可以看到它们都是字面上引用相同的代码。
它们有多相似,事实上这两种工厂和服务方法是可以互换的,所以,如果你一开始感到困惑,就不要出汗了;几乎没有任何差别... 几乎:)
很多人似乎都想知道:"你如何归还一个只有一个功能的工厂或服务,即它本身就是这个功能?"容易..像这样...app.factory('myFactory', function() {
return function(what) {
return "Say " + what;
}
});
答案 2 :(得分:2)
这是一个来自真实项目的认证工厂
//factory using firebase Athentication service
myApp.factory('Authentication', function($firebase,$firebaseAuth,$location){
var ref = new Firebase("URL_to_firebase");
var simpleLogin = $firebaseAuth(ref);
var myObject = {
//user is the data from the FORM
login : function(user){
return simpleLogin.$authWithPassword({
email: user.email,
password: user.password
});
}//login
}//password
return myObject;//factory should return something
});
//and then you call like this in your controller
myApp.controller('myController' , function($scope, $location, $firebaseAuth,Authentication){
$scope.login = function() {
Authentication.login($scope.user)
} //login
});