2

autoForm を使用して新しい入れ子/配列の値をコレクションに追加するのに問題があります。

質問を更新するためにクイックフォームを使用しようとしています。ユーザーがより多くの回答オプションを追加できるようにしたいと思います。私のスキーマは次のようになります (順序、いくつかのメタデータなどを省略して簡略化しています):

questionSchema = new SimpleSchema({
  label: {
    type:   String
  },
  answers: {
    type: Array,
    minCount: 2,
    maxCount: 6
  },
  "answers.$": {
    type: Object
  },
  "answers.$._id": {
    type: String,
    regEx: SimpleSchema.RegEx.Id,
    autoValue: function(){ return Random.id(); },
    autoform: {
      type: "hidden"
    }
  },
  "answers.$.label": {
    type: String,
    regEx: /.{1,150}/,
    autoform: {
      label: false
    }
  },
  "answers.$.count": {
    type: Number,
    defaultValue: 0,
    autoform: {
      type: "hidden"
    }
  }
});

以外に、quickForm を介して質問を追加しただけのときは、オプションanswers.$.labelを使用していませんでした。質問を編集したいときにこれらのオプションを追加しました。そうしないと、nullのままにしたという苦情がありました。だから私はそれらを非表示にしましたが、フォームに入れました。autoformtype='insert'count

私の編集フォームは次のようになります。

{{> quickForm collection="Questions" id="editQuestionForm"
    type="update" setArrayItems="true" doc=questionToEdit
    fields="label, answers"}}

現在、質問のラベルと最初に追加した回答を更新できます。しかし、新しい回答オプションを追加できません。私がそれを行うと、countオプションではないため拒否されます。しかし、私はdefaultValue...を指定しました

ユーザーが変更できる場所にcounts またはsを配置しないように、quickForm を次のようにしたいと思います。_id

{{> quickForm collection="Questions" id="editQuestionForm"
    type="update" setArrayItems="true" doc=questionToEdit
    fields="label, answers, answers.$.label"}}

answers.$._idしかし、私の変更が正しい答えを更新することを確実にするために、そこにとどまって隠しておく必要があるかもしれませんか?

そう:

  1. 私の回答は、挿入時にデフォルトで 0 にカウントされます。回答を編集して追加しても、なぜそうならないのですか?

  2. autoForm は update の代わりに upsert を実行できますか? 新しい質問を挿入したり、既存の質問ラベルを更新したり、必要に応じて または を使用しdefaultalueたりautoValueします。

  3. この種のメソッドを使用する必要がありますか?

4

1 に答える 1

2

編集: サンプルを更新し、テスト アプリをhttp://test-questions.meteor.com/の metoer にデプロイしました。端が少し荒いですが (正直なところ、役に立ちません)、動作中の機能を示す必要があります。下部にある [新しい質問を追加] リンクを使用します。既存の質問は、addquestion フォームの下部に表示されます。既存の質問をクリックして編集します。全体として、機能はそこにあります。悪いデザインで私を嫌いにならないでください。時の女神を責める。


私が通常埋め込みドキュメントを行う方法は、各サブオブジェクトを個別のスキーマに分割することです。これにより、コードが整理されて理解しやすくなり、典型的な落とし穴を回避できます。

これは、動作中の以下の shema を示すサンプル プロジェクトです。git pull と meteor を実行するだけです: https://github.com/nanlab/question


新しいリンクhttp://app-bj9coxfk.meteorpad.com/

コード: http://meteorpad.com/pad/7fAH5RCrSdwTiugmc/


質問.js:

Questions = new Mongo.Collection("questions");

SimpleSchema.answerSchema = new SimpleSchema({
    _id: {
        type: String,
        regEx: SimpleSchema.RegEx.Id,
        autoValue: function() {
            return Random.id();
        },
        autoform: {
            type: "hidden"
        }
    },
    label: {
        type: String,
        regEx: /.{1,150}/,
        autoform: {
            label: false
        }
    },
    count: {
        type: Number,
        autoValue: function() {
            return 0;
        },
    }
})

Questions.attachSchema(new SimpleSchema({
    label: {
        type: String
    },
    answers: {
        type: [SimpleSchema.answerSchema],
        minCount: 2,
        maxCount: 6
    },
}))


Questions.allow({
  insert: function(){return true;},
  update: function(){return true;},
})


if(Meteor.isServer) {
    Meteor.publish("questions", function() {
        return Questions.find();
    })
} else {
    Meteor.subscribe("questions");
}
于 2015-04-16T04:07:08.637 に答える