我将Tagify与我构建的自定义 AngularJS 指令一起使用,Tagify 混合输入返回单个字符串中选定标签和文本的 JSON 对象,例如:
\nvar tagify = new Tagify(myElement, {\n mode: \'mix\',\n pattern: /@/,\n whitelist: [{ value: "User Name", code: \'$name\' }, { value: "Phone Number", code: \'$phone\' }],\n enforceWhitelist: true,\n dropdown: {\n maxItems: 20,\n classname: "tags-look",\n enabled: 0,\n closeOnSelect: true\n }\n});\ntagify.on(\'change\', () => console.log(tagify.DOM.input.value))\nRun Code Online (Sandbox Code Playgroud)\n用户输入将是:
\n\n\n您好
\nUser Name \xc3\x97,短信已发送至您的手机Phone Number \xc3\x97。
这个简单的例子返回:
\n\n\n您好
\n[[{ value: "User Name", code: \'$name\' }]],短信已\n发送到您的手机[[{ value: "Phone Number", code: \'$phone\' }]]。\n(返回的 JSON 已转义)
我稍后要做的是将用户选择的标签(通过键入@字符并从下拉列表中选择它们)替换为我自己的动态变量。
我能够得到一个很好的结果,tagify.DOM.input.textContent因为它呈现了以下结果:
\n\n您好,用户名,短信已发送至您的手机号码。
\n
但是,由于whitelist是可翻译的并且可以是我find and replace以后无法轻松翻译的其他语言,因此我需要的是codeJSON 白名单中的属性而不是value. 我还没有找到方法达到的预期结果是:
\n\n\n
Hello $name, the SMS has been sent to your phone $phone。
谢谢。
\n您可以创建自定义转换函数,以您喜欢的方式转换它,您可以执行类似的操作。
function transformer(value) {
return value.replace(/\[\[(.*?)\]\]/g, (arr => {
let json = JSON.parse(arr);
return json[0].map(e => e.code).join(', ');
}))
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在更改时调用它(或者更确切地说在提交时/或提交之前),如下所示:
tagify.on('change', (e) => transformer(e.detail.value));
Run Code Online (Sandbox Code Playgroud)