我可以阻止Angular.js的json过滤器排除以$开头的属性吗?
Angular.js有一个方便的内置过滤器
json ,它将JavaScript对象显示为格式良好的JSON.
但是,它似乎过滤掉默认以$开头的对象属性: 模板: <pre>{{ {'name':'value','special':'yes','$reallyspecial':'Er...'} | json }}</pre> 显示: { "name": "value","special": "yes" } http://plnkr.co/edit/oem4HJ9utZMYGVbPkT6N?p=preview 我可以将以$开头的属性显示为像其他属性一样吗? 解决方法
基本上你不能.它被“硬编码”到过滤器的行为中.
尽管如此,构建一个自定义JSON过滤器非常容易,该过滤器的行为与Angular相同,但不会过滤掉以’$’开头的属性. (向下滚动以获取示例代码和short demo.) 如果您查看1.2.15 version source code,您会发现json过滤器的定义如下: function jsonFilter() { return function(object) { return toJson(object,true); }; } 所以,它使用toJson()函数(第二个参数(true)意味着:很好地格式化我的JSON). 所以,我们的下一站是toJson()函数,如下所示: function toJson(obj,pretty) { if (typeof obj === 'undefined') return undefined; return JSON.stringify(obj,toJsonReplacer,pretty ? ' ' : null); } 此函数使用“本机” toJsonReplacer()函数处理一些特殊情况:它检查密钥是否以$开头并忽略它(如果它是这样)(它是我们想要更改的)并检查该值是Window,Document还是Scope对象(在这种情况下,它将其转换为描述性字符串,以避免“将循环结构转换为JSON”错误). function toJsonReplacer(key,value) { var val = value; if (typeof key === 'string' && key.charAt(0) === '$') { val = undefined; } else if (isWindow(value)) { val = '$WINDOW'; } else if (value && document === value) { val = '$DOCUMENT'; } else if (isScope(value)) { val = '$SCOPE'; } return val; } 为了完整起见,检查Window和Scope的两个函数如下所示: function isWindow(obj) { return obj && obj.document && obj.location && obj.alert && obj.setInterval; } function isScope(obj) { return obj && obj.$evalAsync && obj.$watch; } 最后,我们需要做的就是创建一个使用完全相同代码的自定义过滤器,唯一的区别是我们的toJsonReplacer()不会过滤掉以$开头的属性. app.filter('customJson',function () { function isWindow(obj) { return obj && obj.document && obj.location && obj.alert && obj.setInterval; } function isScope(obj) { return obj && obj.$evalAsync && obj.$watch; } function toJsonReplacer(key,value) { var val = value; if (isWindow(value)) { val = '$WINDOW'; } else if (value && (document === value)) { val = '$DOCUMENT'; } else if (isScope(value)) { val = '$SCOPE'; } return val; } function toJson(obj,pretty) { if (typeof obj === 'undefined') { return undefined; } return JSON.stringify(obj,pretty ? ' ' : null); } return function(object) { return toJson(object,true); }; }); 另见这short demo. *缺点是您的自定义JSON过滤器不会受益于Angular的json过滤器的进一步改进/增强,因此您必须重新定义您的自定义JSON过滤器以包含更改.当然,对于像这样的基本和简单的过滤器,人们不应该期望频繁或广泛的变化,但这并不意味着不会有任何变化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- vim可视化&Linux系统安全最小化原则& su
- gunicorn开启、关闭和重启
- 单元测试 – 使用角度2配置karma webpack的覆盖范
- WebService大讲堂之Axis2(5):会话(Session)管
- scala – 在开始和结束时间的元组列表中查找空间
- 在AngularJS中使用$broadcast(),$emit()和$on()
- angularjs – $httpBackend.flush()仍然需要超时
- 处理UNIX,Linux和Windows的内存限制和地址空间
- 可排序 – 将参数从指令传递到回调
- angularjs – 在嵌套模型上使用populate从Angula