为什么角度不能在视图中显示原型对象?

时间:2015-08-03 15:58:45

标签: angularjs

我一直在谷歌搜索以找到答案,但我无法这样做。 我发现了这个问题,我不知道是什么原因造成的。我知道存在变通办法,但我想知道为什么会这样。

为什么我无法在{{object}}表达式中显示原型对象?

通过检查$ scope,我知道值存在,但我无法在JSON格式中显示它们。

以下是我制作的实例,告诉了所有内容。

http://plnkr.co/edit/Sm3LXLxbwQ7I5vo2fjbN?p=preview

提前致谢!

更新: 实例已更新,因为之前的链接已被破坏!

第二次更新:

关于Angular函数的答案女巫忽略名称以$开头的对象属性是完全正确的,我理解这些,但昨天我遇到了与Geolocation相同的问题。 地理定位不是Angular对象,它不包含$ sign,但它也不起作用。 请检查新更新的plnkr!并感谢您的努力

2 个答案:

答案 0 :(得分:0)

查看此工作演示:Plunker

您的代码没有显示任何内容,因为过滤器不会显示以$开头的任何属性。来自AngularJS 1.4.3 source code Line 1176

function toJsonReplacer(key, value) {
  var val = value;

  if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {
    val = undefined;
  } else if (isWindow(value)) {
    val = '$WINDOW';
  } else if (value &&  document === value) {
    val = '$DOCUMENT';
  } else if (isScope(value)) {
    val = '$SCOPE';
  }

  return val;
}

因此,如果您将某些属性分配给$location,例如$location.myData = 'Joy';,则会正确显示此数据。

好吧,如果您指定范围$scope.myScope = $scope;并将其显示为{{ myScope | json }},您将获得纯字符$SCOPE

答案 1 :(得分:0)

我不认为你的plunkr与显示原型对象的问题有关,而是更多关于显示$ location的问题。

经过一些调试后,事实证明angular内部调用

  

angular.toJson($位置)

该调用返回一个空对象而不是该对象的字符串化版本。如果您使用JSON.stringify(由angular内部使用,但使用替换器函数忽略以'$'开头的变量名称)

我修改了你的plunkr手动stringify $ location而不是调用angular.toJson。

这是修改过的plunkr:http://plnkr.co/edit/RszniTwU251lcXvJ3cFT?p=preview

请注意我是如何在控制器中添加以下行的:

 $scope.stringifiedLocation = JSON.stringify($location);

视图中的这一行:

 <p>Stringified version ($scope.stringifiedLocation): {{stringifiedLocation}}</p>

产生以下输出:

  

字符串化版本($ scope.stringifiedLocation):   { “$$协议”: “HTTP”, “$$主机”: “run.plnkr.co”, “$$端口”:80, “$$路径”: “”, “$$搜索”:{} , “$$散列”: “”, “$$ URL”: “”, “$$ absUrl”: “http://run.plnkr.co/8NE1mySlQzBI1dLz/”, “$$” 状态:空}

我还添加了一个原型对象来尝试回答原始问题。 JSON.stringify不保留对象的任何原型属性。 More info in this SO question

编辑以解决您的第二次修改

看起来像Geolocation和File(以及许多其他对象)这样的对象即使用flattening也无法正确地进行字符串化。以下是关于为什么的背景,取自here

  

File(以及许多其他)曾经被称为主机对象,平台的一部分主要在C ++中实现 - 它们具有从IDL文件自动生成的JS绑定,如https://github.com/WebKit/webkit/blob/master/Source/WebCore/fileapi/File.idl

     

这些属性被定义为访问者,他们将尝试调用   用C ++实现的访问器---问题在于   Object.create(File.prototype)不会构造C ++后端   对于这个类,因此我们没有真正拥有这些访问器,因此JSC   决定扔到这里(见   https://github.com/WebKit/webkit/blob/master/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm#L2206-L2211   ---如果它不能投射到宿主物体上,它就会扔掉。