在JSON.stringify-ing和JSON.parseing之后恢复对象引用

时间:2013-10-17 15:32:27

标签: javascript angularjs angularjs-scope

考虑下面的代码段。

我的AngularJS应用程序,当我用类别[0]填充$ scope.records'对象时,它们被链接在一起,我可以在我的视图中显示category属性:

JS:

$scope.categories = [{
    title: 'Category 1'
}, {
    title: 'Category 2'
}];

$scope.records = [{title: 'New record', category: $scope.categories[0]}];

HTML:

<select class="form-control input-sm" ng-model="record.category" ng-options="category.title for category in categories"></select>

但是:当我对对象数组进行字符串化然后再解析它时......

var json = JSON.stringify($scope.records);
var parsedJson = JSON.parse(json);

$scope.records = parsedJson;

......我'松开了链接'而且我实际上是创建了一个副本,因此该类别没有显示为'selected',因为:

$scope.records[0].category === $scope.categories[0]评估为假。

有想法解决这个问题吗?

在这种情况下,可能是一个非常愚蠢的问题:对不起: - )

2 个答案:

答案 0 :(得分:0)

尝试

$scope.$apply(function() {
   $scope.records = parsedJson;
});

简而言之,在您的示例中,angularjs不知道某些内容已被更改,您必须通过$scope.$apply调用通知它。检查http://docs.angularjs.org/api/ng。$ rootScope.Scope

这个例子非常类似于我们尝试通过angularjs之外的ajax调用为范围分配一个变量,例如使用纯jquery get方法。在这种情况下,我们做了类似(伪代码)的事情:

$.get("/api/something.json", function(results) {
  $scope.$apply(function() {
     $scope.records = results;
  });
});

答案 1 :(得分:0)

不是将完整的类别对象映射到记录中,而是将其映射到idname,如果将序列化为json并返回

,它将会有效。
$scope.records = [{title: 'New record', category: $scope.categories[0].id}];

选择表达式变为

<select class="form-control input-sm" ng-model="record.category" ng-options="category.title for category.id in categories"></select>