正确使用Angular Factories and Services的方法

时间:2016-08-13 05:15:35

标签: angularjs

我正在寻找一种合理的方式来做这件事。有点学习Angular,我有点困惑......

我有服务

.service('Cameras', function(Camera){
    var _list = [];

  // public API
   this.list = _list;

  document.body.addEventListener("dbready", function(){
  loadCameras(function(result){
    for(var i=0; i < result.rows.length; i++)
      _list.push(new Camera(result.rows.item(i).name, result.rows.item(i).ip, result.rows.item(i).id));
  });
  }, false);


 })

试图使用此工厂

 .factory('Camera', function(name,ip,id) {

    this.name = name;
    this.ip = ip;
    this.videoFiles = [];
    this.photoFiles = [];
    this.battery = 0;
    this.space = 0;
})

创建Camera对象。

我收到此错误

  

[$ injector:unpr]未知提供者:nameProvider&lt; - name&lt; - Camera&lt; - Cameras

我认为这是因为我没有正确地将Camera工厂注入Camera服务中 - 我可能会以错误的方式解决这个问题 - 但任何人都可以让我知道正确的方法!

2 个答案:

答案 0 :(得分:0)

没有。您将Camera声明为Angular服务。

Camera服务需要注入服务'name',服务'ip'和服务'id'。这些服务不存在。

请记住,服务是单身。他们的工厂可以将其他服务作为参数,但不能使用名称,ip或id等数据:Angular在创建唯一的Camera实例时会获取这些数据吗?

如果您需要这些参数来构建相机,那么它根本不应该是服务。只是一个常规的JavaScript构造函数。因此,它不应该注入Cameras服务。

另请注意,相机不会将ID作为参数传递。

答案 1 :(得分:0)

在其他服务中使用服务需要您将服务注入其中

尝试将Camera工厂直接注入服务

.service('Cameras',['Camera', function(Camera){
    var _list = [];

  // public API
   this.list = _list;

  document.body.addEventListener("dbready", function(){
  loadCameras(function(result){
    for(var i=0; i < result.rows.length; i++)
      _list.push(new Camera(result.rows.item(i).name, result.rows.item(i).ip, result.rows.item(i).id));
  });
  }, false);


 }])