在 Ember.js 中,是否可以强制在路由上定义的计算属性在模型刷新时更新?
我注意到,当我第一次点击路由时,我将看到调用支持计算属性的函数,但如果由于查询参数(例如page
)更改而刷新路由模型,则支持计算属性的函数不会再次调用。我认为这是因为 Ember 不相信计算的属性已经改变,部分原因是它不相信它们所依赖的属性已经改变。例如:
// routes/example.js
export default Ember.Route.extend({
limit: 10,
queryParams: {
page: {
refreshModel: true
}
},
offset: computed("limit", function() {
console.log("IN: offset");
let params = this.paramsFor(this.get("routeName"));
if (params.page) {
// calculate offset using the "params.page" value
}
return 0;
}),
paginator: computed("limit", "offset", "query", function() {
console.log("IN: paginator");
// Calls: this.get("offset") and this.get("query") as part of its invocation
// Returns an object that can resolve the pagination of the model.
...
}),
query: computed(function() {
console.log("IN: query");
...
}),
model(params) {
console.log("IN: model");
let paginator = this.get("paginator");
...
},
setupController(controller, model) {
this._super(controller, model);
controller.setProperties({
offset: this.get("offset"),
limit: this.get("limit"),
pageCount: model.meta.total,
});
}
});
...和控制器:
// controllers/example.js
export default Ember.Controller.extend({
actions: {
firstPage: function() {
this.transitionToRoute({
queryParams: {
page: 1
}
});
},
lastPage: function() {
let lastPage = Math.ceil(this.get('pageCount')/this.get('limit'));
this.transitionToRoute({
queryParams: {
page: lastPage
}
});
},
nextPage: function() {
let totalPages = Math.ceil(this.get('pageCount')/this.get('limit'));
if(this.incrementProperty('page') > totalPages) {
this.set('page', totalPages);
}
this.transitionToRoute({
queryParams: {
page: this.get('page')
}
});
},
previousPage: function() {
if(this.decrementProperty('page') < 1) {
this.set('page', 1);
}
this.transitionToRoute({
queryParams: {
page: this.get('page')
}
});
}
},
...
/**
* The result page that a user is currently viewing.
*/
page: 1,
/**
* The query parameters.
*/
queryParams: ["page"],
});
我第一次通过在浏览器中点击关联的 URL 来加载路由时,我看到:
IN: model
IN: paginator
IN: offset
IN: query
如果我单击渲染模板中更改?page
查询参数的按钮,例如使用nextPage
操作,我会看到它调用以刷新模型,但不会调用计算属性背后的任何逻辑,例如:
IN: model
我尝试添加controller.page
到依赖属性列表中,但这似乎并没有改变观察到的行为。顺便说一句,函数似乎总是被调用(如我所料)。
我不应该在路线中使用计算属性吗?似乎如果我想使用计算属性,我需要以某种方式通知 Ember 在刷新模型时重新处理它们,无论 Ember 是否认为它们已经改变。