Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了我可以阻止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);
}

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

大佬总结

以上是大佬教程为你收集整理的我可以阻止Angular.js的json过滤器排除以$开头的属性吗?全部内容,希望文章能够帮你解决我可以阻止Angular.js的json过滤器排除以$开头的属性吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。