【发布时间】:2015-09-15 22:07:45
【问题描述】:
我正在运行一个从 Web API 服务中提取数据的 Angular 应用程序。 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;
});
}
当它到达“item.Selected = false”的行时,它会抛出一条错误消息,说“无法分配给只读属性 Selected”。
我不清楚为什么“选定”是只读的?我不知道 Angular 在读取数据时是否会进行一些时髦的对象处理?我在这里做错了什么?还是我应该以完全不同的方式来处理这个问题?
注意(我想避免使 Selected 成为原始对象的一部分,因为它不代表与该对象相关的任何内容)。
【问题讨论】:
-
你确定你有正确的数据吗?当使用
strict mode(我希望你是)时,尝试将属性分配给原始值(例如字符串或布尔值)将引发此错误。 -
能否确认分配
$scope.myData = data.results;后,$scope.myData确实是预期的数组? -
如果您只在 UI 中使用 selected 并且始终默认为 false,那么为什么要设置它呢?选中时设置为true,取消选中时设置为false。
-
不是一个答案,但我想分享我用来处理将视图特定属性添加到从服务器获取的数据的模式。示例:假设您正在接收用户实体的数组。然后创建一个
UserModel 类,该类在构造函数中需要用户实体对象,并通过可以引用原始属性的entity属性公开它。然后通过带有任何附加属性的“原型”进行扩展。类似方法:medium.com/opinionated-angularjs/… -
检查 $.each 的使用情况,它在遍历数组时返回的第一个参数是索引,第二个是项目。索引是 int,这是不允许添加属性的。 api.jquery.com/jquery.each/#jQuery-each-array-callback
标签: javascript angularjs object