Javascript 如何将js中的字符串作为模板计算

Javascript 如何将js中的字符串作为模板计算,javascript,Javascript,我希望以中央控制的方式进行布线,为此我定义了一些视图,并希望将它们作为模板进行评估,格式如下: `this is a ${variable} in the template` 这是我的密码: const Views = Object.freeze({ Home: {path:"/"}, Kind:{path:"/${kind}", values:{kind:{notNull:true}}}, SearchEntity:{path:"/${kind}/search/${

我希望以中央控制的方式进行布线,为此我定义了一些视图,并希望将它们作为模板进行评估,格式如下:

`this is a  ${variable} in the template`
这是我的密码:

const Views = Object.freeze({
    Home: {path:"/"},
    Kind:{path:"/${kind}", values:{kind:{notNull:true}}},
    SearchEntity:{path:"/${kind}/search/${name}", values:{kind:{notNull:true}, name:{}}},
    Entity:{path:"/${kind}/shop/${eid}", values:{kind:{notNull:true}, eid:{notNull:true}}},
    Issue:{path:"/${kind}/shop/${eid}/issue/${issueId}", values:{kind:{notNull:true}, eid:{notNull:true}, issueId:{notNull:true}}},
    NewShop:{path:"/${kind}/newShop/${name}", values:{kind:{notNull:true}, name:{}}},
})

eval.call({kind:"myKind", eid:"myeid", issueId:"myIssueId"}, Views.Issue.path)
这显然不起作用,这就是为什么我要问这个问题:)

eval方法无法理解上下文:

undefined:1
/${kind}/shop/${eid}/issue/${issueId}
^

SyntaxError: Invalid regular expression flags
    at Object.eval (<anonymous>)
    at Object.<anonymous> (C:\Users\Zied\work\weally\src\util.js:10:6)
    at Module._compile (internal/modules/cjs/loader.js:702:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
    at Module.load (internal/modules/cjs/loader.js:612:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
    at Function.Module._load (internal/modules/cjs/loader.js:543:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:744:10)
    at startup (internal/bootstrap/node.js:240:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:564:3)
未定义:1
/${kind}/shop/${eid}/issue/${issueId}
^
SyntaxError:正则表达式标志无效
在Object.eval()处
反对。(C:\Users\Zied\work\weally\src\util.js:10:6)
at模块编译(内部/modules/cjs/loader.js:702:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:713:10)
at Module.load(内部/modules/cjs/loader.js:612:32)
在tryModuleLoad(内部/modules/cjs/loader.js:551:12)
at Function.Module._load(内部/modules/cjs/loader.js:543:3)
位于Function.Module.runMain(内部/modules/cjs/loader.js:744:10)
启动时(内部/bootstrap/node.js:240:19)
在bootstrapNodeJSCore(internal/bootstrap/node.js:564:3)

当然,我可以有函数而不是模板来解决这个问题,但是我希望有一个更干净的代码,并且我希望以集中的方式在中间插入更多的控件(如NoTalk验证检查等)。因此,我希望将声明与执行分开

不需要
eval
-将
path
属性改为返回模板文本的函数,并调用该函数:

const view=Object.freeze({
问题:{
路径:({kind,eid,issueId})=>`/${kind}/shop/${eid}/issue/${issueId}`,
价值观:{
种类:{
notNull:真
},
eid:{
notNull:真
},
问题ID:{
notNull:真
}
}
},
});
console.log(Views.Issue.path({
种类:“我的种类”,
eid:“myeid”,
issueId:“myIssueId”

}));当然,我可以有函数而不是模板来解决这个问题,但是我希望有一个更干净的代码,并且我希望以集中的方式在中间插入更多的控件(如NoNoLoT检查等)。因此,我希望将声明保留在Excel Suth@ CertainPerformance之外,谢谢您的回答,但正如我刚才所说的(我希望这种类型的答案):自然地,我可以有函数而不是模板来解决这个问题,但是我希望有一个更干净的代码,我想用更多的控件来干预中间。(如notNull检查等)以集中的方式。所以我希望声明与执行分开,正如您可能已经注意到的,在执行模板之前必须处理notNull元数据,集中的行为会带来其他约束GREAT ANKS!所以如果我理解得很好,没有简单的js方法可以做到这一点?它需要一个regexp工作围绕“简单的方法做”就是使用这个函数,但如果不是这样,你就必须编写一些更复杂的代码来手动替换。我暂时不会将答案标记为正确,只是为了让那些有更多“本地”解决方案的人回答。如果没有人回答,我会假设没有直接的js解决方案来满足这一需求,我会将你的答案标记为正确答案1