В Ember.js можно ли принудительно заставить вычисленные свойства, определенные на маршруте, обновляться при обновлении модели?
В 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, что они изменились или нет.