为什么push不能在这个cookie数组上运行?

时间:2014-10-27 22:31:33

标签: javascript angularjs cookies

这很好用:

$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
}

为什么我会收到TypeError?

如果我这样做

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正在做一些我想的恶事。它甚至来自哪里?

真的不知道发生了什么是非常诚实的。请帮忙。我试图做的就是追加一个数组...

1 个答案:

答案 0 :(得分:3)

根据AngularJS $cookie documentation

  

只显示一个简单的对象,通过在此对象中添加或删除属性,在当前$ eval的末尾创建/删除新的cookie。 对象的属性只能是字符串。

您的初始代码有效,因为您可以随时在任何对象上设置任何类型的属性。但是,Angular不会保留非字符串值,因此不再在后一个使用上下文中设置animals属性。在编写和阅读(分别)时,您必须序列化和反序列化(可能通过JSON)。

所以你需要做这样的事情来初始化cookie:

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是我的猫,但这个奇怪的对象正在做一些我想的邪恶事。它甚至来自哪里?

当你看到

object Object
在JavaScript中,您将看到JavaScript对象上的默认toString()方法的输出。换句话说,您在字符串的上下文中使用了一个对象,因此JS将其强制转换为字符串(这会产生您要质疑的值)。

FWIW,我开发了一个JavaScript cookie库,它允许您传入任何数据并为您处理序列化。它目前托管在Google code上,但我正在努力将其移至GitHub,并希望有一天能为它添加一个AngularJS模块。