困在字符串变量

时间:2016-12-10 03:11:43

标签: javascript node.js web

我有一个存储在变量中的模板Hello, ${user.name}。我正在使用Hello, ${user.name}从外部文件中读取此内容。

现在,显然当我附加到目标div的innerHTML时,它会按原样显示字符串而不是“Hello,James”(假设user.name = James)。 有没有办法实现它?

extfile.txt =>
fs.read

Node.js code =>

fs.readFile(__dirname + '/extfile.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  } else {
    let x = JSON.parse(data);
    socket.emit('var',x.A);
  }
});

HTML =>

socket.on('var',function(x)){
  getElementById('target').innerHTML = x;
}

3 个答案:

答案 0 :(得分:5)

我稍微重写了提交的解决方案here

这里,eval评估作为常规字符串提供的ES6模板字符串。模板字符串中使用的局部作用域中的任何变量都需要作为第二个参数中传递的对象的属性提供(因为使用function eval_template(s, params) { return Function(...Object.keys(params), "return " + s) (...Object.values(params)); } const template = "`Welcome, ${user.name}`"; console.log(eval_template(template, {user: {name: "James"}}));创建的函数位于全局作用域中且无法访问局部变量)。

这非常接近使用eval_template("tag`${boo}`", {tag, boo}); 。您可能希望选择不同的方法来处理模板字符串。 ES6模板字符串被设计为用于创建字符串文字的运行时机制,而不是可以存储和重用模板的模板语言。



public class PalindromicPrime {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    final int NUMBER_OF_PALINPRIME = 100;
    int numberPrinted = 0, testedNumber = 2;

 while (numberPrinted < NUMBER_OF_PALINPRIME) {
    if (isPrime(testedNumber) && isPalindrome(testedNumber)) {
        numberPrinted++;
        System.out.print(testedNumber + " ");
    if (numberPrinted % 10 == 0) {
        System.out.println();
}//end of 2nd if
} //end of 1st if
testedNumber++;



}// end while




} // main method




/** Check whether number is prime */
 public static boolean isPrime(int number) {
    for (int divisor = 2; divisor <= number / 2; divisor++) {
    if (number % divisor == 0) { // If true, number is not prime
    return false; // number is not a prime
   } // end if
  } // end for loop



    return true; // number is prime
 } // end isPrime method
public static int reverse(int number) {


int reverse = 0;
  int digit;

  do {
   digit = number % 10;
   reverse = reverse * 10 + digit;
   number /= 10;
  } // end do;
  while (number != 0);

  return reverse;
 } // end reverse method

 public static boolean isPalindrome(int number) {

  return (number == reverse(number));

 } // end isPalindrome method

} // end class
&#13;
&#13;
&#13;

只要标签作为参数传入,就没有理由不能将它与标记的模板字符串一起使用:

{{1}}

答案 1 :(得分:0)

模板文字需要<Location "/myApp"> AuthType Basic AuthName "Authorized Users Only" AuthBasicProvider file AuthUserFile "/usr/local/secure/htpasswd/passwords" Require user my_user ProxyPass http://localhost:8080/myApp ProxyPassReverse http://localhost:8080/myApp </Location> ,而不是&符号。另外,请记住使用反引号而不是引号。

答案 2 :(得分:0)

有时我在另一个文件中包含标签变量时也会遇到此问题,并且这些标签应具有模板文字。在这种情况下,我通常使用一种变通方法来模拟这种行为(将此代码作为指导:D)

labels.js:

export default:{
    labelWithSpeudoliteral: "text to {{change}}"
}

MyHelper.js:

    generateLiteral(s, params) {
        const entries = Object.entries(params);
        let sentence = s;
        entries.forEach((entry) => {
                const literal = `{{${entry[0]}}}`
                sentence = sentence.replace(literal, entry[1]);
            }
        )
        return sentence;
    }

现在在我的代码中,我通过以下方式使用此帮助程序:

console.log(generateLiteral(labels.labelWithSpeudoliteral, {'change': 'literal'})

标签的结果应为:

text to literal

如您所见,使用{{}}符号作为标记,generateLiteral()使用它们以及接收到的参数来更改模板文字的文本值。这不是最好的方法,但我希望它可以为您提供帮助。