为什么推送对此cookie数组无效

Why does push not work on this cookie array?

本文关键字:cookie 数组 无效 为什么      更新时间:2023-09-26

这很好用:

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

大写OObject是我的猫,但我认为那个奇怪的object在做邪恶的事情。它是从哪里来的?

老实说,我真的不知道发生了什么。请帮忙。我所要做的就是附加到一个数组。。。

根据AngularJS$cookie文档:

只有一个简单的对象被公开,通过向该对象添加或从中删除属性,在当前$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) : [];

至于你补充的备注:

大写OObject是我的猫,但我认为那个奇怪的物体在做邪恶的事情。它是从哪里来的?

当你看到

object Object

在JavaScript中,您可以看到JavaScript对象上默认toString()方法的输出。换句话说,您在字符串的上下文中使用了一个对象,所以JS将其强制转换为字符串(这会导致您质疑的值)。

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