Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向角度对象添加特性_Javascript_Angularjs_Object - Fatal编程技术网

Javascript 向角度对象添加特性

Javascript 向角度对象添加特性,javascript,angularjs,object,Javascript,Angularjs,Object,我正在运行一个Angular应用程序,它从Web API服务中提取数据。API将对象作为JSON返回,Angular服务(通过$http.get())将它们作为对象数组返回给控制器。很正常的东西 我想做的是为每个返回的对象添加一个名为“Selected”的属性。此属性纯粹用于GUI目的(是否在UI中选择了对象),不需要以任何方式持久化。我认为最简单的方法是循环返回的对象数组并添加它。因此,我的代码如下所示: function getData() { myService.getData()

我正在运行一个Angular应用程序,它从Web API服务中提取数据。API将对象作为JSON返回,Angular服务(通过$http.get())将它们作为对象数组返回给控制器。很正常的东西

我想做的是为每个返回的对象添加一个名为“Selected”的属性。此属性纯粹用于GUI目的(是否在UI中选择了对象),不需要以任何方式持久化。我认为最简单的方法是循环返回的对象数组并添加它。因此,我的代码如下所示:

function getData() {
    myService.getData()
        .then(function(data) {
            $scope.myData = data.results;
            // Add a "Selected" property to each object
            $.each($scope.myData, function(item) {
                item.Selected = false;
            });
}
function getData() {
    myService.getData()
        .then(function(data) {
            $scope.myData = data.results;
            // Add a "Selected" property to each object
            $.each($scope.myData, function(index, item) { //index was added here!
                item.Selected = false;
            });
}
当它到达显示“item.Selected=false”的行时,会抛出一条错误消息,说明“无法分配给只读属性Selected”

我不清楚为什么“Selected”是只读的?我不知道Angular在读取数据时是否会进行一些古怪的对象处理?我做错了什么?或者我应该以完全不同的方式来处理这个问题


注意(我希望避免将选定对象作为原始对象的一部分,因为它不代表与该对象相关的任何内容)

要将属性添加到对象使用

“each u.each(list,iteratee,[context])别名:forEach 迭代元素列表,依次生成一个iteratee函数。如果传递了一个,iteratee将绑定到上下文对象。每次调用iteratee都使用三个参数:(元素、索引、列表)进行调用。如果列表是JavaScript对象,iteratee的参数将是(值、键、列表)。返回链接列表。”

“扩展uu.extend(目标,*源) 将源对象中的所有属性复制到目标对象,然后返回目标对象。这是正确的,因此最后一个源将覆盖前面参数中相同名称的属性。“


要将属性添加到对象使用

“each u.each(list,iteratee,[context])别名:forEach 迭代元素列表,依次生成一个iteratee函数。如果传递了一个,iteratee将绑定到上下文对象。每次调用iteratee都使用三个参数:(元素、索引、列表)进行调用。如果列表是JavaScript对象,iteratee的参数将是(值、键、列表)。返回链接列表。”

“扩展uu.extend(目标,*源) 将源对象中的所有属性复制到目标对象,然后返回目标对象。这是正确的,因此最后一个源将覆盖前面参数中相同名称的属性。“

事实上,调试器提供的错误消息比您发布的(我的重点)更有用:

无法分配给0的只读属性“Selected”

这表明您得到的不是对象,而是一个数字作为
变量(本例中为0)。在严格模式下将属性指定给基元会引发此“无法指定给只读属性”错误。(如果没有严格模式,它只会无声地失败。)

正如注释中所指出的,这是因为
$。每个
调用函数时传递了两个参数,第一个是索引,第二个是值。见:

回调

类型:函数(整数数组,对象值)

因此,即使您将参数命名为
,它也会收到当前索引的值。这意味着只需将缺少的第一个参数添加到回调中即可修复代码,如下所示:

function getData() {
    myService.getData()
        .then(function(data) {
            $scope.myData = data.results;
            // Add a "Selected" property to each object
            $.each($scope.myData, function(item) {
                item.Selected = false;
            });
}
function getData() {
    myService.getData()
        .then(function(data) {
            $scope.myData = data.results;
            // Add a "Selected" property to each object
            $.each($scope.myData, function(index, item) { //index was added here!
                item.Selected = false;
            });
}
事实上,调试器提供的错误消息比您发布的(我的重点)更有用:

无法分配给0的只读属性“Selected”

这表明您得到的不是对象,而是一个数字作为
变量(本例中为0)。在严格模式下将属性指定给基元会引发此“无法指定给只读属性”错误。(如果没有严格模式,它只会无声地失败。)

正如注释中所指出的,这是因为
$。每个
调用函数时传递了两个参数,第一个是索引,第二个是值。见:

回调

类型:函数(整数数组,对象值)

因此,即使您将参数命名为
,它也会收到当前索引的值。这意味着只需将缺少的第一个参数添加到回调中即可修复代码,如下所示:

function getData() {
    myService.getData()
        .then(function(data) {
            $scope.myData = data.results;
            // Add a "Selected" property to each object
            $.each($scope.myData, function(item) {
                item.Selected = false;
            });
}
function getData() {
    myService.getData()
        .then(function(data) {
            $scope.myData = data.results;
            // Add a "Selected" property to each object
            $.each($scope.myData, function(index, item) { //index was added here!
                item.Selected = false;
            });
}

你确定你有正确的数据吗?使用
严格模式时(我希望您是),尝试将属性分配给基元值(如字符串或布尔值)将引发此错误。在分配
$scope.myData=data.results
$scope.myData
确实是预期的数组吗?如果您仅在UI中使用selected,并且始终默认为false,为什么要设置它?选择时将其设置为true,取消选择时将其设置为false。这不是答案,但我希望共享用于将视图特定属性添加到从服务器获取的数据的模式。示例:假设您有一个用户实体的接收和数组。然后创建一个
User
模型类,该类期望构造函数中的用户实体对象,并通过可以引用原始属性的
entity
属性将其公开。然后通过带有任何附加属性的“Prototype”进行扩展。类似的方法:检查$的使用情况。在遍历数组时,它返回的第一个参数是索引,第二个参数是项。索引是int,这是不允许添加属性的。你确定你有正确的数据吗?使用
严格模式时(我希望您是),尝试将属性分配给基元值(如字符串或布尔值)将引发此错误。在分配
$scope.myData=data.results
$scope.myData
确实是预期的数组?如果您仅在UI中使用selected和