Angularjs工厂的回报是什么?

时间:2014-10-13 12:47:12

标签: javascript angularjs angularjs-service

我无法理解工厂如何返回自己的对象。例如:

var myapp = angular.module('myapp',[]);
myapp.factory('myfactory',function(){


     var foo = {};
     factory.message = function(){

         //do something

      }


     return foo;

 });

现在,我可以从我的控制器中调用此工厂的方法,例如myfactory.message 但是工厂构造函数如何返回自身的对象。它是否与角度的工厂实现有关,或者我在这里缺少一些javascript基础知识?

3 个答案:

答案 0 :(得分:1)

这是纯粹的JavaScript功能。

正在创建一个名为' factory'的新空文字对象。这是一个不同的对象。该行" var factory = {}"是什么创造了对象。从那里你可以在这个新对象上添加函数(方法),例如"消息&#34 ;.

我还没有玩过Angular一段时间,但它唯一能为你做的就是将这个新的返回对象分配给你指定的名字' myfactory'

变量在函数内部命名为factory的事实可能让您感到困惑。这个名字可能就像" foo"或者"建设者"它会起作用。

在回复您的上一条评论时,请参阅以下有关工厂返回"本身的实例"

工厂构造函数未返回'本身'的实例。工厂方法采用(在这种情况下)两个参数a" name"和功能。该函数返回一个提供所需功能的对象(包含方法,属性等)。

所有myapp(angular internals)上的工厂方法正在分配' name'从函数返回的对象并使其可供控制器使用。

不要挂断角度回归工厂的想法。 Angular只需要一段代码(提供程序),为控制器提供一些功能。 例如,可以像这样创建服务:

function Houdini(){
    this.doIt = function(){
    alert("abracadabra");
    };
}

myapp.factory("mrMagic", function doSomethingGreat(){
  return new Houdini()
})

稍后在你的控制器中你可以做

mrMagic.doIt()。

答案 1 :(得分:0)

你可以从documentation注意到, Note: All services in Angular are singletons. That means that the injector uses each recipe at most once to create the object. The injector then caches the reference for all future needs.

因此,当您声明某个工厂时 - 您声明将返回并注入dependency injection的对象

顺便说一句,所有内容都在services here的文档中进行了描述:

Angular services are:

- Lazily instantiated – Angular only instantiates a service when an application component depends on it.
- Singletons – Each component dependent on a service gets a reference to the single instance generated by the service factory.

编辑:

从观点JavaScript开始,当您通过链接复制Object时会发生这种情况,例如:

var obj1 = {name: 'Alex', id: 2};
var obj2 = obj1;
console.log(obj1.name) // 'Alex'
console.log(obj2.name) // 'Alex'
obj2.name = 'Max';
console.log(obj2.name) // 'Max'
console.log(obj1.name) // 'Max'

所以你可以检查角度相同:

.factory('myfactory', ['$q', function ($q) {
    return {
        someArray: [1, 2]
    }
}])

然后在控制器中:

.controller('ctrl1', ['$scope', 'myfactory', function ($scope, myfactory) {
    myfactory.someArray[0] = 100500;
})

.controller('ctrl2', ['$scope', 'myfactory', function ($scope, myfactory) {
    console.log(myfactory.someArray[0]); /* if this controller is initialized after 'ctrl1' - you will see in console '100500' instead of '1' */
})

顺便说一下,.factory()是一个返回Object的函数。在注入一些服务时,在angular内部 - 第一次调用.factory()回调并创建返回对象的实例。在角度返回后,只有 ONE Object的实例。不是它的副本。

希望,它会对你有帮助。

答案 2 :(得分:0)

问题本身是错误的。这是你在做什么,看" theFactory"那里 - 那是工厂......你从来没有回过工厂实例。

var myapp = angular.module('myapp',[]);
myapp.factory('myfactory',function theFactory(){


     var service = {};

     service.message = function(){

         //do something

      }


     return service;

 });

查看更多示例:ngtutorial.com/learn/service.html#/toc_3