2014-10-27 64 views
0

這工作得很好:爲什麼push不能在這個cookie數組上工作?

$cookies.animals = [] 
$cookies.animals.push({cat: 'meow'}) 
console.log($cookies.animals) -> [Object] 

但相同的工廠函數內部代碼不起作用:

addAnimal: function(id, name, price){ 
    console.log($cookies.animals) //-> [object Object] 
    $cookies.animals.push({cat: 'meow'}) //-> TypeError: undefined is not a function 
} 

那麼,爲什麼我得到一個類型錯誤?

如果我這樣做

addAnimal: function(id, name, price){ 
    $cookies.animals = [] 
    console.log($cookies.animals) //-> [] 
    $cookies.animals.push({cat: 'meow'}) //-> works 
} 

它的工作原理(當然它重置陣列)這樣一些奇怪的事情是發生在$cookies.animals

如果我們看一下我的console.log工廠函數內部:

我們得到這樣的:

[object Object] 

Object大寫O是我的貓,但奇怪的object做邪惡的東西,我認爲。它甚至來自哪裏?

真的不知道發生了什麼很坦白。請幫助。所有我想要做的就是追加到一個數組...

回答

3

AngularJS $cookie documentation

只有一個簡單的物體曝光,並通過從這個對象添加或刪除屬性/,新的餅乾在當前$ eval結尾創建/刪除。 該對象的屬性只能是字符串。

您的初始代碼有效,因爲您可以隨時在任何對象上設置任何類型的屬性。儘管Angular不支持你的非字符串值,所以你的animals屬性不再設置在後面的使用上下文中。在寫和讀時(分別),你必須序列化和反序列化(可能通過JSON)。

所以你需要做這樣的事情來初始化餅乾:

var animals = []; 

animals.push('Furry Cat'); 

$cookies.animals = JSON.stringify(animals); 

後來讀書的時候,你需要做:

var animal_cookie_value = $cookies.animals, 
    animals = animal_cookie_value ? JSON.parse(animal_cookie_value) : []; 

至於讓您的評論的:

Object大寫O是我的貓,但奇怪的物體在做一些事情EV我想。它甚至來自哪裏?

當你看到

object Object 
在JavaScript

您所看到的JavaScript對象的默認toString()方法的輸出。換句話說,你在一個字符串的上下文中使用了一個對象,所以JS把它轉換爲字符串(這會導致你正在質疑的值)。

FWIW,我開發了一個JavaScript cookie庫,允許您傳入任何數據併爲您處理序列化。它目前在Google code上託管,但我正在將其移動到GitHub,並希望有一天能爲其添加AngularJS模塊。

+0

你能詳細解釋一下序列化和反序列化嗎?可能有一個例子嗎?謝謝 – Starkers 2014-10-27 22:45:14

+0

我已經添加了一個指向JSON序列化頁面的鏈接,並添加了最少的代碼示例。 – JAAulde 2014-10-27 22:50:25

+0

@JJAAulde酷...這是一個工作,但?或者做得很好,被廣泛使用?唯一的選擇是存儲在多個cookie中,但我不想用一大堆cookies來填滿客戶端! – Starkers 2014-10-27 22:54:54

相關問題