2013-05-21 168 views
0

我一直在AngularJS中使用服务来在控制器之间共享数据。在一个特定的服务中,我还想公开一些功能来编辑共享对象。我创建了一个简单的jsfiddle这里:在AngularJS服务中共享数据

http://jsfiddle.net/RichardBender/CQ6Z4/2/

angular.module('myApp', []) 
.factory('myService', function() { 
    return { 
     mySharedObject:{ 
      myText:'abc' 
     }, 
     updateObject: function() { 
      console.log('function called'); 
      console.log(this); 
      this.mySharedObject.myText = 'def'; 
     } 
    }; 
}) 

我可以看到,“本”当我打电话updateObject()是不是字面服务返回的对象。我意识到我可以简单地使这个服务依赖于另一个只公开共享数据对象的服务,但是有没有办法在不创建第二个服务的情况下这样做呢?

感谢, 理查德

回答

3

在JavaScript中this关键字可以是一个有点混乱,因为在大多数情况下,它的值由函数是怎么被调用来确定。互联网上有很多很好的文章描述了这种行为(this one seems pretty good)。

我平时做这样的事情在我的服务 - var myService在服务工厂,现在你可以在你的其他服务注入相同的对象:

.factory('myService', function() { 
    var myService = { 
    mySharedObject:{ 
     myText:'abc' 
    }, 
    updateObject: function() { 
     console.log('function called'); 
     console.log(this); 
     myService.mySharedObject.myText = 'def'; 
    } 
    }; 
    return myService; 
}) 

我已经更新了你的例子来告诉你如何你可以从this得到预期的价值和一个简单的解决方案,以便如何避免使用thishttp://jsfiddle.net/sRb2N/

+0

非常感谢,完美的工作。我对“这个”还是有点朦胧,所以我很欣赏文章链接。 –

+0

如果您发现“此”行为令人困惑,您可以考虑使用Coffeescript。他们引入了两个运算符( - >和=>),后者自动完成了joakimbl在上面做的事情。这样,你可以指望“this”被定义为在函数被定义的地方匹配“this”,而不是它被调用的地方。 –