我想使用模式对象中的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'函数中起作用,因为当调用该函数时,它只能通过实例化的模型提取存储的值。
答案 0 :(得分:1)
在上面的用例中,似乎 dest
和prefix
表示Keystone Admin UI中无需提供的生成值。 Mongoose有一个名为virtual attributes的功能,您可以精确地使用该功能。 虚拟属性是通过调用Mongoose 架构的.virtual()
方法来定义的。由于Keystone在其.schema
属性中公开了任何列表的猫鼬架构,因此您可以轻松地将dest
和prefix
转换为虚拟属性 。
除虚拟属性外,Mongoose还提供instance methods,您可以从中引用任何已定义的虚拟属性。您将 format
转换为实例方法,然后只需引用其中的prefix
虚拟属性。
最后,确保在调用List的 .register()
方法之前定义任何虚拟属性和实例方法。有关详细信息,请查看schema plugins上的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允许您为每个定义的定义getter
和setter
(分别使用.get()
和.set()
方法)虚拟属性。但是,由于{_ 1}}和dest
在您的用例中似乎是只读,因此我在上面的示例代码中仅为它们定义了prefix
。 德尔>