是否可以根据之前的答案更改Yeoman中的默认值:选项?

时间:2014-02-01 01:30:51

标签: gruntjs yeoman

我很好奇是否可以更改提示的默认消息,具体取决于用户从之前的提示中选择的内容。

现在我的第一个提示只是一个列表,用户选择一个选项,并询问其他一些问题。请注意,这两个在两个不同的生成器中运行

YeomanGenerator.prototype.askForThings = function askForThings() {
  var cb = this.async();
  var prompts = [{
    name: 'questionOne',
    type: 'list',
    message: 'Message, message?',
    choices: ['optionOne', 'optionTwo', 'optionThree', 'optionFour', 'optionFive', 'optionSix', 'None'],
    filter: function(value) { 
      return value.toLowerCase(); 
    }
  }

然后,在下一部分中,将询问用户放置此目录的目录。但是,我想知道是否可以根据用户在questionOne中选择的内容来更改默认位置。现在,default选项只是空的。

YeomanGenerator.prototype.askForMoreThings = function askForMoreThings() {
  var cb = this.async();

  var questionOne = this.questionOne;

    {
      name: 'questionOneDirectory',
      message: 'Question question',
      default: function(default) {
        if (this.questionOne === 'optionOne') {
          this.default("'/directory/_one'");
        }
        else if (this.questionOne === 'optionTwo') {
          this.default("'/directory/_two'");
        }
        { 
          //etc 
        }
      },
      filter: function(value) { return value.split('/').pop(); },
      when: function() {
        return questionOne;
      },

甚至可以在此更改默认消息吗?这只是一件小事,但我想知道它是否可能。提前谢谢。

2 个答案:

答案 0 :(得分:11)

以下是搜索问题主题答案的人的通用解决方案。 default属性接受一个函数,并传递一个包含所有先前答案的对象。使用该对象在运行时生成默认值:

this.prompt([{
  name: 'title',
  message: 'Your title?',
  default: 'Mr.'
}, {
  name: 'name',
  message: 'Your name?',
  default: function(answers) {
    return answers.title + ' Smith';
  }
}]);

答案 1 :(得分:0)

好吧,我实际上是靠自己想出来的。我必须声明一个变量questionOneDefaultDirectory,然后在下面运行if / else if,然后从提示符中调用该变量。代码现在看起来像这样:

YeomanGenerator.prototype.askForThings = function askForThings() {
  var cb = this.async();
  var prompts = [{
    name: 'questionOne',
    type: 'list',
    message: 'Message, message?',
    choices: ['optionOne', 'optionTwo', 'optionThree', 'optionFour', 'optionFive', 'optionSix', 'None']
  }

然后是最后一部分。

YeomanGenerator.prototype.askForMoreThings = function askForMoreThings() {
  var questionOne = this.questionOne;
  var cb = this.async();

  var questionOneDefaultDirectory;

  if (this.questionOne === 'optionOne') {
    questionOneDefaultDirectory = '/directory/_one'
  }
  else if (this.questionOne === 'optionTwo') {
    questionOneDefaultDirectory = '/directory/_two'
  }
  { 
    //etc 
  }

    this.prompt([{
      name: 'questionOneDirectory',
      message: 'Question question',
      default: questionOneDefaultDirectory,
      filter: function(value) { return value.split('/').pop(); },
      when: function() {
        return questionOne;
      }
    }], function (etcetc) {
      // etc
    }

现在,根据第一个问题中选择的内容,默认目录将根据回答的内容而改变。