, выбрав опцию, мне нужно обновить фрагмент, который в настоящее время виден.
blockquote>Чтобы получить ссылку на текущий видимый фрагмент, предположим, что у вас есть ссылка на
ViewPager
какmPager
. Затем следующие шаги получат ссылку наcurrentFragment
:
PageAdapter adapter = mPager.getAdapter();
int fragmentIndex = mPager.getCurrentItem();
FragmentStatePagerAdapter fspa = (FragmentStatePagerAdapter)adapter;
Fragment currentFragment = fspa.getItem(fragmentIndex);
Обычно используется только литая строка 3.
FragmentStatePagerAdapter
является полезным адаптером для ViewPager.
Я действительно нашел другой способ, который, как я полагаю, более оптимизирован, потому что он делегирует всю эту работу фактическому движку базы данных. Это использует совокупность. При этом мне даже не нужно создавать совершенно новую модель для фрагмента - я могу просто получить ее из основной модели. Вот как я это сделал:
Employee.aggregate()
.lookup({
from: 'cities',
localField: 'residenceAddress.city',
foreignField: '_id',
as: 'residenceAddress'
})
.addFields({
residenceCity: { $arrayElemAt: ['$residenceAddress', 0] },
residenceState: { $arrayElemAt: ['$residenceAddress', 0] }
})
.project({
firstName: 1,
lastName: 1,
residenceCity: '$residenceCity.cityName',
residenceState: '$residenceState.state',
})
.then((result) => {
// do whatever stuff I need with the snippet resulting from this process
});
OK. Я нашел решение, которое работает, хотя я не знаю, является ли оно оптимальным для случаев, когда я рисую большое количество документов модели из БД. Но, в любом случае, вот оно.
Мне нужно использовать почтовый хук для init в схеме фрагмента. Другими словами, EmployeeSnippet должен выглядеть так:
const EmployeeSnippetSchema = new Schema({
firstName: String,
lastName: String,
address: {
city: {
type: Schema.Types.ObjectId,
ref: 'City',
autopopulate: { select: 'cityName state' }
}
},
residenceCity: String,
residenceState: String
});
Я просто добавляю следующий хук:
[ 1111]EmployeeSnippetSchema.post('init', function(doc) {
if (doc.address && doc.address.city) {
doc.residenceCity = doc.address.city.cityName;
doc.residenceState = doc.address.state;
}
delete doc.address;
});
И это работает, хотя, как я сказал ранее, я не знаю, является ли это оптимизированным решением, когда мы получаем большое количество документы, но это лучшее, что я мог придумать.
P.S. Я только что понял, что использовал «autopopulate», который не является функцией, которая поставляется из коробки с мангустом. На самом деле это плагин команды Mongoose: http://plugins.mongoosejs.io/plugins/autopopulate