2017-02-28 119 views
1

我需要通過將兩個實際字段連接在一起來創建模型的名稱字段爲虛擬。此名稱僅用於顯示。我已經嘗試了文檔中的虛擬示例,但沒有運氣。 Keystone 4 beta5。虛擬「名稱」字段?

var keystone = require('keystone') 
    _ = require('underscore'); 
var Types = keystone.Field.Types; 

/** 
* Foo Model 
* ================== 
*/ 

var Foo = new keystone.List('Foo', { 
     map: {name: 'fooname'}, 
     track: true 
}); 

Foo.add({ 
     bar: { type: Types.Relationship, required: true, initial: true, label: 'Barref', ref: 'Bar', many: false }, 
     order: { type: Types.Select, required: true, initial: true, label: 'Order', options: _.range(1,100) }, 
     price: { type: Types.Money, format: '$0,0.00', label: 'Price', required: true, initial: true }, 
}); 

Foo.schema.virtual('fooname').get(function() { 
     return this.bar+ ' ' + this.order; 
}); 

Foo.defaultColumns = 'fooname, bar, order, price'; 
Foo.register(); 

當我使用此模型定義時,在defaultcolumns列表中看不到虛擬名稱。我想創建一個虛擬名稱,以便在將此模型用作關係時查找更容易。

回答

-1

您能否提供更多信息?什麼是目前的工作?它應該如何工作? 示例代碼?

編輯:

創建模型Foo後,您可以訪問使用屬性Foo.schema貓鼬架構。 (Keystone Concepts

這個schema提供了一個pre鉤 - 所有的方法,其中掛鉤。 (Mongoose API Schema#pre

其中的一個方法是save,它可以這樣使用:

Foo.schema.pre('save', function(next){ 
    console.log('pre-save'); 
    next(); 
}); 
+0

編輯初始文章添加代碼示例模型和更多的解釋。 thx –

-1

試試這個:

Foo.schema.pre('save', function (next) { 
    this.name = this.bar+ ' '+ this.order; 
    next(); 
}); 
+1

儘管這可能會解決作者的問題,但僅有代碼的答案對實際學習沒有多大幫助。你可能會解釋爲什麼這是答案。 –

0

你並不需要一個虛擬的做到這一點。每次保存文檔時,Keystone允許您跟蹤和重新計算字段。您可以啓用這些選項以創建一個函數,將這兩個值連接起來(同步或異步,您的選擇)。

我注意到的另一件事是barRelationship,這意味着您需要在獲得任何有用的信息之前填充該關係。這也意味着您的value函數必須是異步的,這與將回調函數作爲參數傳遞給該函數一樣簡單。其他的是Keystone。如果您不需要此bar中的任何信息,並且您只需要_id(該模型始終具有),則可以不使用我包含的keystone.list('Bar')函數。

http://keystonejs.com/docs/database/#fields-watching

map對象還指的是你的模型的選項,所以你需要在你的模型fooname屬性在任何情況下,儘管它會動態計算。

var keystone = require('keystone'), 
    _ = require('underscore'); 
var Types = keystone.Field.Types; 

/** 
* Foo Model 
* ================== 
*/ 

var Foo = new keystone.List('Foo', { 
     map: {name: 'fooname'}, 
     track: true 
}); 

Foo.add({ 
     fooname: { type: Types.Text, watch: true, value: function (cb) { 
      // Use this if the "bar" that this document refers to has some information that is relevant to the naming of this document. 
      keystone.list('Bar').model.findOne({_id: this.bar.toString()}).exec(function (err, result) { 
       if (!err && result) { 
        // Result now has all the information of the current "bar" 
        // If you just need the _id of the "bar", and don't need any information from it, uncomment the code underneath the closure of the "keystone.list('Bar')" function. 
        return cb(this.bar.name + " " + this.order); 
       } 
      }); 
      // Use this if you don't need anything out of the "bar" that this document refers to, just its _id. 
      // return cb(this.bar.toString() + " " + this.order); 
     } }, 
     bar: { type: Types.Relationship, required: true, initial: true, label: 'Barref', ref: 'Bar', many: false }, 
     order: { type: Types.Select, required: true, initial: true, label: 'Order', options: _.range(1,100) }, 
     price: { type: Types.Money, format: '$0,0.00', label: 'Price', required: true, initial: true }, 
}); 

Foo.defaultColumns = 'fooname, bar, order, price'; 
Foo.register();