如何在Keystone LocalFile字段中指定自定义dev /前缀

时间:2015-01-21 21:18:43

标签: mongoose keystonejs mongoose-plugins

我想使用模式对象中的keystone.List构造函数中的autokey插件生成的相同值,我稍后将其传递给List.add。

这更准确地说是我要做的事情:

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值?

顺便提一下,引用在'format'函数中起作用,因为当调用该函数时,它只能通过实例化的模型提取存储的值。

1 个答案:

答案 0 :(得分:1)

在上面的用例中,似乎destprefix表示Keystone Admin UI中无需提供的生成值。 Mongoose有一个名为virtual attributes的功能,您可以精确地使用该功能。 虚拟属性是通过调用Mongoose 架构.virtual()方法来定义的。由于Keystone在其.schema属性中公开了任何列表的猫鼬架构,因此您可以轻松地将destprefix转换为虚拟属性

虚拟属性外,Mongoose还提供instance methods,您可以从中引用任何已定义的虚拟属性。您将format转换为实例方法,然后只需引用其中的prefix 虚拟属性

最后,确保在调用List的.register()方法之前定义任何虚拟属性实例方法。有关详细信息,请查看schema plugins上的Keystone文档。

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

对不起上面冗长且无用的解释。我没有意识到destprefixLocalFile架构的一部分。

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