2013-05-21 159 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」,而不是它被調用的地方。 –