6

選項在我Stacks模式,我有一個dimensions屬性定義爲這樣:使用對象爲自動窗體

dimensions: { 
    type: [String], 
    autoform: { 
     options: function() { 
      return Dimensions.find().map(function(d) { 
       return { label: d.name, value: d._id }; 
      }); 
     } 
    } 
} 

這個作品真的很好,並採用蒙我能看到,試圖通過插入數據形式運作良好(在這種情況下,我選擇了兩個尺寸插入)

Mongol image

但是我真的什麼是存儲實際尺寸對象,而不是它的關鍵數據。事情是這樣的:

[Mongol good[2]

要努力實現這一點,我改變了type:[String]type:[DimensionSchema]value: d._idvalue: d。這裏的想法是,我告訴表單,我期待一個對象,現在正在返回對象本身。

但是,當我運行這個我在我的控制檯中得到以下錯誤。

流星目前不支持其他對象不是對象ID爲IDS

閒逛一點點,改變type:[DimensionSchema]type: DimensionSchema我在控制檯中看到一些新的錯誤(他們很可能被埋在type是數組

console image

所以看起來自動窗體正試圖採取我要存儲在個值e數據庫並嘗試將其用作ID。任何想法的最佳方式來做到這一點?

僅供參考,這裏是我DimensionSchema

export const DimensionSchema = new SimpleSchema({ 
    name: { 
     type: String, 
     label: "Name" 
    }, 
    value: { 
     type: Number, 
     decimal: true, 
     label: "Value", 
     min: 0 

    }, 
    tol: { 
     type: Number, 
     decimal: true, 
     label: "Tolerance" 
    }, 
    author: { 
     type: String, 
     label: "Author", 
     autoValue: function() { 
      return this.userId 
     }, 
     autoform: { 
      type: "hidden" 
     } 
    }, 
    createdAt: { 
     type: Date, 
     label: "Created At", 
     autoValue: function() { 
      return new Date() 
     }, 
     autoform: { 
      type: "hidden" 
     } 
    } 
}) 
+0

你見過[this](https://github.com/aldeed/meteor-autoform/issues/798)的問題嗎? – MasterAM

+0

@MasterAM nope。這幾乎涵蓋了它。感謝您給我關閉。 – Chris

+1

問題是,你確定要嵌入整個文檔嗎?也許你只需要一個子集?是否有可能在未來維度發生變化(如果是這樣,你如何計劃以可維護的方式更新嵌套文檔)?您也可以使用Meteor方法來處理表單並在其中執行所有操作。 – MasterAM

回答

1

根據我的經驗和aldeed自己在this issue,autoform對對象數組字段不太友好。

我通常會建議不要以這種方式嵌入這些數據。它使數據更難以維護,以防將來修改dimension文檔。

替代

  • 您可以使用包像publish-composite創建無功加入出版物,而只有在stack文檔中嵌入的_id秒。
  • 您可以使用類似PeerDB的軟件包來爲您執行反規範化操作,它也會爲您更新嵌套的文檔。考慮到它帶有一條學習曲線。
  • 手動編寫使用AutoForm無法輕鬆創建的特定窗體。這給你最大限度的控制,有時比所有的修補更容易。

如果你堅持使用自動窗體

雖然有可能以create a custom input type(通過AutoForm.addInputType()),我不會推薦它。這將需要您創建一個模板並修改其valueOut方法中的數據,並且生成編輯表單不會很容易。

由於這是一個具體的使用情況下,我認爲最好的辦法是在流星方法使用稍微修改過的模式和處理數據。

定義的模式與一個字符串數組:

export const StacksSchemaSubset = new SimpleSchema({ 
    desc: { 
    type: String 
    }, 
    ... 
    dimensions: { 
    type: [String], 
    autoform: { 
     options: function() { 
     return Dimensions.find().map(function(d) { 
      return { label: d.name, value: d._id }; 
     }); 
     } 
    } 
    } 
}); 

然後,渲染quickForm,指定模式和一種方法:

<template name="StacksForm"> 

    {{> quickForm 
    schema=reducedSchema 
     id="createStack" 
     type="method" 
     meteormethod="createStack" 
     omitFields="createdAt" 
    }} 

</template> 

並定義適當的輔助傳遞的模式:

Template.StacksForm.helpers({ 
    reducedSchema() { 
    return StacksSchemaSubset; 
    } 
}); 

而在服務器上,定義方法並改變插入前。

Meteor.methods({ 
    createStack(data) { 
    // validate data 
    const dims = Dimensions.find({_id: {$in: data.dimensions}}).fetch(); // specify fields if needed 
    data.dimensions = dims; 
    Stacks.insert(data); 
    } 
}); 
0

我能在這個時刻提醒(如果犯規支持object類型的值),是將對象轉換爲string(即序列化字符串),並設置唯一作爲「維」鍵(而不是對象)的值並將其保存到數據庫中。

雖然從數據庫回來,只是將該值(string)再次序列化爲object

相關問題