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=="});