link 到页面完全刷新
Page full refresh on link-to
各位。从 2.9.1 更新 Ember 到 2.10 后我有一个奇怪的行为。此次更新后,当我使用 link-to 助手导航 List links 时,我得到了整页刷新而不是粒子刷新。在 Ember 2.9.1 中是粒子刷新。也许我在这些更新中遗漏了一些东西。
这是我的列表代码
app/router.js
import Ember from 'ember';
import config from './config/environment';
const Router = Ember.Router.extend({
location: 'auto',
rootURL: '/app/'
});
Router.map(function() {
this.route('home', { path: '/' });
this.route('list', { path: '/list/:listId' }, function() {
this.route('lead', { path: 'lead/:leadId', resetNamespace: true });
});
this.route('pageNotFound', { path: '/page-not-found' });
});
controllers/list.js
import Ember from 'ember';
export default Ember.Controller.extend({
queryParams: ['page', 'sortBy', 'direction', 'archived'],
page: 1,
perPage: 50,
sortBy: 'createdAt',
direction: 'asc',
archived: false
});
routes/list.js
import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import RouteMixin from 'ember-cli-pagination/remote/route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, RouteMixin, {
queryParams: {
page: {refreshModel: true},
perPage: {refreshModel: true},
sortBy: {refreshModel: true},
direction: {refreshModel: true},
archived: {refreshModel: true}
},
intercom: Ember.inject.service('intercom'),
leadLink: 'lead',
model(params)
{
var intercom = this.get('intercom');
var store = this.get('store');
var list;
params.leadLink = this.leadLink;
if (params.listId) {
list = this.store.findRecord('list', params.listId).then(function (list) {
intercom.update({
"Emails": list.get('user.discovered_emails'),
"Limit": list.get('user.max_discovered_emails')
});
return list;
});
}
else {
params.title = 'All leads';
}
return Ember.RSVP.hash({
list: list,
leads: this.store.query('lead', {
filter: this.getFilter(params)
}, { reload: true }).then(function (leads) {
params.total = leads.get('meta.total');
leads.forEach(function (lead) {
var list = store.peekRecord('list', lead.get('listId'));
lead.set('list', list);
return lead;
});
return leads;
}),
lists: this.store.peekAll('list'),
params: params
});
},
// ....
templates/components/sidebar-list-item.hbs
{{#link-to "list" list.id (query-params page=1 archived=false)}}<i class="icon-list-unordered"></i> {{list.name}} <span class="text-muted text-thin">{{#if activeLeadsCount}}({{activeLeadsCount}}){{/if}}</span>{{/link-to}}
感谢您的帮助。
我想指出我在发布的代码中发现的问题,
1.Inside 列出路由模型挂钩,您正在尝试使用 peekAll
和 peekRecord
从商店加载 list
模型,但我还没有找到代码加载 list
模型进行存储。
不做 findAll('list')
如果你做 peekAll
或 peekRecord
你将一无所获,因为 peekAll
或 peekRecord
都会 return无论已经加载到商店中,它都不会从服务器中获取它。
因此您需要将 list
模型记录加载到 store
。为此,您可以在 beforeModel
挂钩中执行此操作,或者您可以在任何一个父路由
中执行此操作
beforeModel(transition){
this._super(...arguments);
return this.store.findAll('list');
}
2.For link-to
helper 如果我们提供动态段值(在你的情况下 list.id
)那么它将始终调用 beforeModel
, model
和 afterModel
勾。
3.Also 如果您不想选择完全转换,请设置 {refreshModel: false}
对不起,伙计们。我发现它不是完全刷新。我有 application-loading.hbs 和加载圈。它只出现在应用程序启动时,但在修复 https://github.com/emberjs/ember.js/pull/14545 之后,它会在我刷新列表模型时随时出现。
无论如何感谢您的帮助!
各位。从 2.9.1 更新 Ember 到 2.10 后我有一个奇怪的行为。此次更新后,当我使用 link-to 助手导航 List links 时,我得到了整页刷新而不是粒子刷新。在 Ember 2.9.1 中是粒子刷新。也许我在这些更新中遗漏了一些东西。
这是我的列表代码
app/router.js
import Ember from 'ember';
import config from './config/environment';
const Router = Ember.Router.extend({
location: 'auto',
rootURL: '/app/'
});
Router.map(function() {
this.route('home', { path: '/' });
this.route('list', { path: '/list/:listId' }, function() {
this.route('lead', { path: 'lead/:leadId', resetNamespace: true });
});
this.route('pageNotFound', { path: '/page-not-found' });
});
controllers/list.js
import Ember from 'ember';
export default Ember.Controller.extend({
queryParams: ['page', 'sortBy', 'direction', 'archived'],
page: 1,
perPage: 50,
sortBy: 'createdAt',
direction: 'asc',
archived: false
});
routes/list.js
import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import RouteMixin from 'ember-cli-pagination/remote/route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, RouteMixin, {
queryParams: {
page: {refreshModel: true},
perPage: {refreshModel: true},
sortBy: {refreshModel: true},
direction: {refreshModel: true},
archived: {refreshModel: true}
},
intercom: Ember.inject.service('intercom'),
leadLink: 'lead',
model(params)
{
var intercom = this.get('intercom');
var store = this.get('store');
var list;
params.leadLink = this.leadLink;
if (params.listId) {
list = this.store.findRecord('list', params.listId).then(function (list) {
intercom.update({
"Emails": list.get('user.discovered_emails'),
"Limit": list.get('user.max_discovered_emails')
});
return list;
});
}
else {
params.title = 'All leads';
}
return Ember.RSVP.hash({
list: list,
leads: this.store.query('lead', {
filter: this.getFilter(params)
}, { reload: true }).then(function (leads) {
params.total = leads.get('meta.total');
leads.forEach(function (lead) {
var list = store.peekRecord('list', lead.get('listId'));
lead.set('list', list);
return lead;
});
return leads;
}),
lists: this.store.peekAll('list'),
params: params
});
},
// ....
templates/components/sidebar-list-item.hbs
{{#link-to "list" list.id (query-params page=1 archived=false)}}<i class="icon-list-unordered"></i> {{list.name}} <span class="text-muted text-thin">{{#if activeLeadsCount}}({{activeLeadsCount}}){{/if}}</span>{{/link-to}}
感谢您的帮助。
我想指出我在发布的代码中发现的问题,
1.Inside 列出路由模型挂钩,您正在尝试使用 peekAll
和 peekRecord
从商店加载 list
模型,但我还没有找到代码加载 list
模型进行存储。
不做 findAll('list')
如果你做 peekAll
或 peekRecord
你将一无所获,因为 peekAll
或 peekRecord
都会 return无论已经加载到商店中,它都不会从服务器中获取它。
因此您需要将 list
模型记录加载到 store
。为此,您可以在 beforeModel
挂钩中执行此操作,或者您可以在任何一个父路由
beforeModel(transition){
this._super(...arguments);
return this.store.findAll('list');
}
2.For link-to
helper 如果我们提供动态段值(在你的情况下 list.id
)那么它将始终调用 beforeModel
, model
和 afterModel
勾。
3.Also 如果您不想选择完全转换,请设置 {refreshModel: false}
对不起,伙计们。我发现它不是完全刷新。我有 application-loading.hbs 和加载圈。它只出现在应用程序启动时,但在修复 https://github.com/emberjs/ember.js/pull/14545 之后,它会在我刷新列表模型时随时出现。 无论如何感谢您的帮助!