簡體   English   中英

Meteor AutoForm:如何使用子文檔數組更新架構值?

[英]Meteor AutoForm: How to update schema values with array of sub-documents?

我是Meteor AutoForm的新手。 我想用國家/地區doc更新播放器文檔。 以下是我的代碼。 如果我在AutoForm中添加{{> afQuickField name="country"}} ,則無效。 {{> afQuickField name="name"}}單獨工作正常。 如何在玩家國家/地區字段中添加整個國家/地區文檔(_id,slug,name)

JS:

CountrySchema = new SimpleSchema({
    _id: {
        type: String,
        index: true
    },
    slug: {
        type: String,
        max: 100,
        index: true
    },
    name: {
        type: String,
        max: 100
    }
});

Player.attachSchema(new SimpleSchema({
    name: {
        type: String,
        label: "Player name",
        index: true
    },
    country: {
        type: [CountrySchema],
        label: "country",
        max: 5,
        index: true,
        autoform: {
            options: function() {
                return Country.find().fetch().map(function(object) {
                    return {
                        label: object.name,
                        value: object._id
                    };
                });
            }
        }
    }
})); 

HTML:

{{#autoForm id="editplayer" }}
   {{> afQuickField name="name"}}
   {{> afQuickField name="country"}}
{{/autoForm}}

我添加了SimpleSchema.debug = true; 控制台日志顯示SimpleSchema invalid keys for "editplayer" context

如果要將country作為數組字段呈現,可以使用afArrayField組件:

<template name="editPlayer">
    {{#autoForm id="editplayer" collection="Player" type="update" doc=currentPlayer}}
        {{> afQuickField name="name"}}
        {{> afArrayField name="country"}}
        <button type="submit">Submit</button>
    {{/autoForm}}
</template>

if (Meteor.isClient) {
    AutoForm.debug();
    Template.editPlayer.helpers({
        currentPlayer: function () {
            return Player.findOne();
        }
    });
}

if (Meteor.isServer) {
    Meteor.startup(function () {
        let country = {slug: 'austria', name: 'Austria'};
        Country.insert(country);
        Player.insert({name: 'Matthias Eckhart', country: [country]});
    });
}

Player = new Mongo.Collection("player");
Country = new Mongo.Collection("country");

CountrySchema = new SimpleSchema({
    slug: {
        type: String,
        max: 100,
        index: true
    },
    name: {
        type: String,
        max: 100
    }
});

Player.attachSchema(new SimpleSchema({
    name: {
        type: String,
        label: "Player name",
        index: true
    },
    country: {
        type: [CountrySchema],
        label: "country",
        max: 5,
        index: true,
        autoform: {
            options: function () {
                return Country.find().map((object) => ({label: object.name, value: object._id}));
            }
        }
    }
}));

請注意,我假設您要更新player文檔。 因此,我設置屬性doc=currentPlayer並通過currentPlayer輔助函數指定player文檔。 如果您設置數據上下文,例如通過Iron Router路由中的data功能 ,則可以使用doc=this


如果您想要一個簡單的選擇表單,您當前的數據結構可能需要一個解決方法 問題是[CountrySchema]沒有擴展到正確的架構鍵。 因此,您需要使用AutoForm掛鈎和Meteor輔助函數( currentPlayer )顯式指定完整架構並轉換所選選項:

<template name="editPlayer">
    {{#autoForm id="editplayer"  collection="Player" type="update" doc=currentPlayer}}
        {{> afQuickField name="name"}}
        {{> afQuickField name="country"}}
        <button type="submit">Submit</button>
    {{/autoForm}}
</template>

if (Meteor.isClient) {
    AutoForm.debug();
    Template.editPlayer.helpers({
        currentPlayer: function () {
            let player = Player.findOne();
            if (player) player.country = _.map(player.country, (country) => country._id);
            return player;
        }
    });
    var playerUpdateHook = {
        before: {
            update: function (doc) {
                doc['$set'].country = _.map(doc['$set'].country, (countryId) => Country.findOne({_id: countryId}));
                return doc;
            }
        }
    };
    AutoForm.addHooks('editplayer', playerUpdateHook);
}

if (Meteor.isServer) {
    Meteor.startup(function () {
        let country = {slug: 'austria', name: 'Austria'};
        let countryId = Country.insert(country);
        country = Country.findOne({_id: countryId});
        Player.insert({name: 'Matthias Eckhart', country: [country]});
    });
}

Player = new Mongo.Collection("player");
Country = new Mongo.Collection("country");

CountrySchema = new SimpleSchema({
    _id: {
        type: String,
        index: true
    },
    slug: {
        type: String,
        max: 100,
        index: true
    },
    name: {
        type: String,
        max: 100
    }
});

Player.attachSchema(new SimpleSchema({
    name: {
        type: String,
        label: "Player name",
        index: true
    },
    country: {
        type: [CountrySchema],
        label: "country",
        max: 5,
        index: true
    },
    'country.$': {
        type: String,
        autoform: {
            options: function () {
                return Country.find().map((object) => ({label: object.name, value: object._id}));
            }
        }
    }
}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM