1

後で List.add に渡すスキーマ オブジェクトの keystone.List コンストラクターで autokey プラグインから生成された同じ値を使用したいと考えています。

私がやろうとしていることは、より正確には次のとおりです。

var Thing = new keystone.List('Thing', {
    autokey: { path: 'slug', from: 'title', unique: true }
});

Thing.add({
    image: {
        type: Types.LocalFile,
        dest: 'public/images/things/'+Thing.slug,
        prefix: '/images/things/'+Thing.slug+'/',
        format: function( ThingDoc, file ) { return '<img src="/images/things/'+ThingDoc.slug+'/'+file.filename+'" style="max-width:300px" />' }
    }
});

だから、もちろんうまくいきません。autokeyed slug 値が何であれ、スキーマの後の時点で再利用するにはどうすればよいですか?

ちなみに、参照は「format」関数で機能します。その関数が呼び出されると、インスタンス化されたモデルを介して保存された値をプルできるからです。

4

1 に答える 1

1

上記のユースケースでは、 Keystone Admin UI で使用する必要のない生成された値をdestとが表しているようです。prefixMongoose には、このユース ケースに正確に使用できる仮想属性と呼ばれる機能があります。仮想属性.virtual()は、Mongooseスキーマのメソッドを呼び出すことによって定義されます。Keystone はそのプロパティで任意の Listのマングーススキーマを公開するため、仮想属性に簡単に変換できます。.schemadestprefix

仮想属性に加えて、Mongoose にはインスタンス メソッドも用意されており、そこから定義済みの仮想属性を参照できます。インスタンス メソッドに変換formatし、その中から仮想属性を参照するだけです。prefix

最後に、List のメソッドを呼び出す前に、必ず仮想属性インスタンス メソッド.register()を定義してください。詳細については、スキーマ プラグインに関する Keystone ドキュメントを参照してください。

仮想属性インスタンス メソッドを使用したコード例を次に示します。

上記の長くて曲がりくねった役に立たない説明で申し訳ありません。dest私はそれを認識しておらず、スキーマprefixの一部でした.LocalFile

アップロードごとにカスタム パスを持つことは、私にはあまり意味がありません。単一のファイルを保存するためのカスタム/個別のパスは、あまり役に立たないようです。ただし、デフォルトで自動作成されるカスタム ファイル名を持つことはできslugます。これが私がそれを行う方法です。うまくいけば、これはあなたのために働く.

var Thing = new keystone.List('Thing', {
  autokey: { path: 'slug', from: 'title', unique: true }
  }
});

Thing.add({
    image: {
      type: Types.LocalFile,
      dest: 'public/images/things/',
      prefix: '/images/things/',
      filename: function(item, file) {
        return item.slug;
      },
      format: function(item, file) { 
        return '<img src="' + item.prefix + item.filename + '" style="max-width:300px" />';
      }
});

Thing.register();

注: Mongoose では、定義済みの仮想属性ごとに agetterと a の両方をsetter(それぞれ.get()とメソッドを使用して) 定義できます。ただし、ユースケースでは と が読み取り専用のように見えるため、上記のサンプル コードではのみを定義しました。.set()destprefixgetter

于 2015-01-23T00:56:46.293 に答える