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" />' }
    }
});

所以这当然行不通。我怎样才能在我的模式中重新使用自动键入的 slug 值?

顺便说一句,引用在“格式”函数中起作用,因为当调用该函数时,它可以通过实例化模型提取存储的值。

4

1 回答 1

1

在您上面的用例中,似乎destprefix表示生成的值不需要在 Keystone Admin UI 中可用。Mongoose 有一个称为虚拟属性的功能,您可以将其精确地用于此用例。虚拟属性是通过调用.virtual()Mongoose模式的方法来定义的。由于 Keystone在其属性中公开了任何 List的猫鼬模式.schema,因此您可以轻松地将dest和转换prefix虚拟属性

除了虚拟属性,Mongoose 还提供实例方法,您可以从中引用任何已定义的虚拟属性。您转换format实例方法,然后简单地从其中引用prefix 虚拟属性

最后,确保在调用 List 的方法之前定义了任何虚拟属性实例.register()方法。查看关于模式插件的 Keystone 文档以获取更多详细信息。

这是您使用虚拟属性实例方法的代码示例。

很抱歉上面冗长而无用的解释。我没有意识到这一点,dest并且prefixLocalFile架构的一部分。

每次上传都有一个自定义路径对我来说没有多大意义。恕我直言,存储单个文件的自定义/单独路径似乎不是很有用。但是,具有默认为自动创建的自定义文件名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 允许您为每个定义的虚拟属性getter同时定义 a和 a setter(分别使用.get()和方法) 。但是,由于and在您的用例中似乎是只读的,因此我只在上面的示例代码中为它们定义了 a 。.set()destprefixgetter

于 2015-01-23T00:56:46.293 回答