这很好用:
$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
正在做一些我想的恶事。它甚至来自哪里?
真的不知道发生了什么是非常诚实的。请帮忙。我试图做的就是追加一个数组...
答案 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模块。