我可以停止Angular.js’;s json筛选器,以排除以$开头的属性?

我可以停止Angular.js’;s json筛选器,以排除以$开头的属性?,json,angularjs,angularjs-filter,Json,Angularjs,Angularjs Filter,js有一个方便的内置过滤器,它将JavaScript对象显示为格式良好的JSON 但是,默认情况下,它似乎会过滤掉以$开头的对象属性: 模板: 我可以让以$开头的属性像其他属性一样显示吗?基本上不能。它被“硬编码”到过滤器的行为中。 尽管如此,构建一个与Angular的过滤器行为相同的自定义JSON过滤器还是很容易的,但不过滤掉以“$”开头的属性 (进一步向下滚动查看示例代码和a) 如果查看,您会发现json过滤器的定义如下: function toJson(obj, pretty) {

js有一个方便的内置过滤器,它将JavaScript对象显示为格式良好的JSON

但是,默认情况下,它似乎会过滤掉以
$
开头的对象属性:

模板:


我可以让以
$
开头的属性像其他属性一样显示吗?

基本上不能。它被“硬编码”到过滤器的行为中。
尽管如此,构建一个与Angular的过滤器行为相同的自定义JSON过滤器还是很容易的,但不过滤掉以“$”开头的属性

(进一步向下滚动查看示例代码和a


如果查看,您会发现
json
过滤器的定义如下:

function toJson(obj, pretty) {
  if (typeof obj === 'undefined') return undefined;
  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);
}
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;
}
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, toJsonReplacer, pretty ? '  ' : null);
    }

    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);
}
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;
}
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, toJsonReplacer, pretty ? '  ' : null);
    }

    return function(object) {
        return toJson(object, true);
    };
});
此函数使用“native”函数,传递自定义替换函数(
toJsonReplacer


toJsonReplacer()
函数处理一些特殊情况:它检查键是否以
$
开头,如果以
$
开头则忽略它(这是我们想要更改的),并检查值是窗口、文档还是范围对象(在这种情况下,它将其转换为描述性字符串以避免“将循环结构转换为JSON”错误)


为完整起见,检查窗口和范围的两个函数如下所示:

function toJson(obj, pretty) {
  if (typeof obj === 'undefined') return undefined;
  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);
}
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;
}
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, toJsonReplacer, pretty ? '  ' : null);
    }

    return function(object) {
        return toJson(object, true);
    };
});

最后,我们需要做的就是创建一个使用完全相同代码的自定义过滤器,唯一的区别是我们的
toJsonReplacer()
不会过滤掉以
$
开头的属性

另请参见此


*缺点是,您的自定义JSON过滤器不会从Angular的
JSON
过滤器的进一步改进/增强中受益,因此您必须重新定义您的过滤器以合并更改。当然,对于这样一个基本而简单的过滤器,您不应该期望频繁或广泛的更改,但这并不意味着不会发生更改无论如何。

回答得很好。“我们所需要做的就是创建一个自定义过滤器,它使用完全相同的代码,唯一的区别是我们的
toJsonReplacer()
不会检查以
$
开头的属性。”这听起来有点像“你只需将这块石头放入热水中(连同一些蔬菜和股票)我没有收到你的评论,但如果你喜欢,我可以随意回答;)@ExpertSystem仅供参考,前面的评论引用了这个古老的民间故事: