AugluarJS 截断尾随等号
AugluarJS truncating trailing equal sign
AngularJS 在路由到它们时截断尾随等号。我有一个 base64 字符串,需要将其作为查询参数添加到 url(route)
例如:http://example.com/#!/updatepassword?code=NnuW3q49QW38Mf-Cg==
加载为:
http://example.com/#!/updatepassword?code=NnuW3q49QW38Mf-Cg
有解决办法吗?
如果您尝试将路由设置为字符串,则需要转义 =
符号。那是因为这个字符在查询字符串中有特殊的含义——它将参数名称与其值分开。
因此,一种解决方案可能是:
var query = "code=NnuW3q49QW38Mf-Cg==";
$location.url("/some/path?" + encodeURIComponent(query));
encodeURIComponent() 会做什么,是否会替换所有特殊字符 - 例如 =
将替换为 %3D
。这将防止它被解释为键值分隔符。
如果只想更改查询字符串参数,而不是整个URL,也可以使用$location.search()
方法:
$location.search("code", "NnuW3q49QW38Mf-Cg==");
请记住向该方法传递两个参数,而不是一个。如果你这样做:
$location.search("code=NnuW3q49QW38Mf-Cg==");
=
符号不会被转义,只会被剥离。
Angular内部使用parseKeyValue()
函数解析查询字符串,可以找到here。您可以看到拆分是在 =
符号上完成的。这就是他们被剥夺的原因。
但是如果你看一下 .search()
method implementation,你会发现 parseKeyValue()
只有在你向 .search()
提供一个参数时才会被调用。如果您提供参数名称作为第一个参数,而值作为第二个参数,则不会调用它。
查看源代码还提出了另一种解决方案:
$location.search({"code": "NnuW3q49QW38Mf-Cg=="});
AngularJS 在路由到它们时截断尾随等号。我有一个 base64 字符串,需要将其作为查询参数添加到 url(route)
例如:http://example.com/#!/updatepassword?code=NnuW3q49QW38Mf-Cg==
加载为: http://example.com/#!/updatepassword?code=NnuW3q49QW38Mf-Cg
有解决办法吗?
如果您尝试将路由设置为字符串,则需要转义 =
符号。那是因为这个字符在查询字符串中有特殊的含义——它将参数名称与其值分开。
因此,一种解决方案可能是:
var query = "code=NnuW3q49QW38Mf-Cg==";
$location.url("/some/path?" + encodeURIComponent(query));
encodeURIComponent() 会做什么,是否会替换所有特殊字符 - 例如 =
将替换为 %3D
。这将防止它被解释为键值分隔符。
如果只想更改查询字符串参数,而不是整个URL,也可以使用$location.search()
方法:
$location.search("code", "NnuW3q49QW38Mf-Cg==");
请记住向该方法传递两个参数,而不是一个。如果你这样做:
$location.search("code=NnuW3q49QW38Mf-Cg==");
=
符号不会被转义,只会被剥离。
Angular内部使用parseKeyValue()
函数解析查询字符串,可以找到here。您可以看到拆分是在 =
符号上完成的。这就是他们被剥夺的原因。
但是如果你看一下 .search()
method implementation,你会发现 parseKeyValue()
只有在你向 .search()
提供一个参数时才会被调用。如果您提供参数名称作为第一个参数,而值作为第二个参数,则不会调用它。
查看源代码还提出了另一种解决方案:
$location.search({"code": "NnuW3q49QW38Mf-Cg=="});