我一直在谷歌搜索以找到答案,但我无法这样做。 我发现了这个问题,我不知道是什么原因造成的。我知道存在变通办法,但我想知道为什么会这样。
为什么我无法在{{object}}
表达式中显示原型对象?
通过检查$ scope,我知道值存在,但我无法在JSON格式中显示它们。
以下是我制作的实例,告诉了所有内容。
http://plnkr.co/edit/Sm3LXLxbwQ7I5vo2fjbN?p=preview
提前致谢!
更新: 实例已更新,因为之前的链接已被破坏!
第二次更新:
关于Angular函数的答案女巫忽略名称以$开头的对象属性是完全正确的,我理解这些,但昨天我遇到了与Geolocation相同的问题。 地理定位不是Angular对象,它不包含$ sign,但它也不起作用。 请检查新更新的plnkr!并感谢您的努力
答案 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 ---如果它不能投射到宿主物体上,它就会扔掉。