- 8 个页面 exercise-card 由 bind:tap 改为 catch:tap,拦截原生 tap 冒泡 避免一次点击被『自定义事件 + 原生冒泡』触发两次, 第二次 e.detail 无 id → navigateTo detail?id=undefined → 404 - 所有 onExercise 顶部加 id 守卫,无 id 直接 return - exercise-card 点击前校验 exercise.id,缺失不触发 - detail onLoad 的 id 为空时直接显示空态,不再发起错误请求
79 lines
2.2 KiB
JavaScript
79 lines
2.2 KiB
JavaScript
const app = getApp();
|
|
const planSvc = require('../../services/plan');
|
|
const favSvc = require('../../services/favorite');
|
|
const auth = require('../../utils/auth');
|
|
|
|
Page({
|
|
data: {
|
|
statusBarHeight: 20,
|
|
slug: '',
|
|
collection: null,
|
|
exercises: [],
|
|
total: 0,
|
|
loading: true,
|
|
favorited: false
|
|
},
|
|
|
|
onLoad(query) {
|
|
const slug = query.slug || '';
|
|
this.setData({ statusBarHeight: app.globalData.statusBarHeight || 20, slug });
|
|
this.load();
|
|
if (auth.isLogin()) {
|
|
favSvc.planStatus(slug).then((r) => {
|
|
this.setData({ favorited: !!(r && r.favorited) });
|
|
}).catch(() => {});
|
|
}
|
|
},
|
|
|
|
load() {
|
|
this.setData({ loading: true });
|
|
planSvc.officialExercises(this.data.slug, 1, 60).then((res) => {
|
|
this.setData({
|
|
collection: res.collection,
|
|
exercises: (res && res.items) || [],
|
|
total: (res && res.total) || 0,
|
|
loading: false
|
|
});
|
|
}).catch(() => {
|
|
this.setData({ loading: false });
|
|
});
|
|
},
|
|
|
|
// 收藏 / 取消收藏官方计划
|
|
onToggleFav() {
|
|
auth.ensureLogin().then(() => {
|
|
const slug = this.data.slug;
|
|
const wasFav = this.data.favorited;
|
|
const op = wasFav ? favSvc.removePlan(slug) : favSvc.addPlan(slug);
|
|
op.then(() => {
|
|
this.setData({ favorited: !wasFav });
|
|
wx.showToast({ title: wasFav ? '已取消收藏' : '已收藏', icon: 'none' });
|
|
}).catch(() => {});
|
|
}).catch(() => {});
|
|
},
|
|
|
|
// 导入到我的计划
|
|
onImport() {
|
|
auth.ensureLogin().then(() => {
|
|
wx.showLoading({ title: '导入中…', mask: true });
|
|
planSvc.importOfficial(this.data.slug).then(() => {
|
|
wx.hideLoading();
|
|
wx.showToast({ title: '已导入到我的计划', icon: 'success' });
|
|
setTimeout(() => {
|
|
wx.navigateTo({ url: '/pages/my-plans/my-plans' });
|
|
}, 600);
|
|
}).catch(() => {
|
|
wx.hideLoading();
|
|
});
|
|
}).catch(() => {});
|
|
},
|
|
|
|
onExercise(e) {
|
|
if (!e || !e.detail || !e.detail.id) return;
|
|
wx.navigateTo({
|
|
url: '/pages/detail/detail?from=collection&slug=' +
|
|
encodeURIComponent(this.data.slug) + '&id=' + encodeURIComponent(e.detail.id)
|
|
});
|
|
}
|
|
});
|