加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

我可以阻止Angular.js的json过滤器排除以$开头的属性吗?

发布时间:2020-12-17 17:40:39 所属栏目:安全 来源:网络整理
导读:Angular.js有一个方便的内置过滤器 json ,它将JavaScript对象显示为格式良好的JSON. 但是,它似乎过滤掉默认以$开头的对象属性: 模板: pre{{ {'name':'value','special':'yes','$reallyspecial':'Er...'} | json }}/pre 显示: { "name": "value","special"
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);
}

此函数使用“本机”JSON.stringify()函数,传递自定义替换函数(toJsonReplacer).

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过滤器以包含更改.当然,对于像这样的基本和简单的过滤器,人们不应该期望频繁或广泛的变化,但这并不意味着不会有任何变化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读