В 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, что они изменились или нет.

0 ответов

Другие вопросы по тегам