Вычисляемая недвижимость в медленном угле - PullRequest
0 голосов
/ 16 мая 2018

Я построил вычисляемое свойство внутри моей модели, чтобы выполнить расчет расстояния до местоположения, используя местоположение пользователя и местоположение точки интереса (в данном случае виноградники).Кажется, что вычисление занимает секунду, и шаблон отображается, даже если атрибут milesAway не был установлен.Таким образом, не предоставляя соответствующую информацию.Есть идеи?Код модели ниже ...

import DS from 'ember-data';
import attr from 'ember-data/attr';
import { belongsTo, hasMany } from 'ember-data/relationships';
import EmberObject, { computed, observer } from '@ember/object';
import { inject as service } from '@ember/service';

export default DS.Model.extend({
  featuredImages: hasMany('contentful-asset'),
  featured: attr('boolean'),
  name: attr('string'),
  slug: attr('string'),
  rating: attr('number'),
  location: attr('string'),
  latitude: attr('string'),
  longitude: attr('string'),
  bodyOne: attr('string'),
  milesAway: attr('string', {async: false}),
  googleMapsApi: Ember.inject.service(),
  googleLocation: computed(function() {
    let userLocation = 'Hard Coded Test Address';
    let endLocation = this.get('location');
    let milesAway = '';
    let googleMapsApi = this.get('googleMapsApi');
    this.get('googleMapsApi.google').then((google) => {
      var self = this;
      let distanceMatrixService = new google.maps.DistanceMatrixService();
      function calculateDistance() {
        distanceMatrixService.getDistanceMatrix({
          origins: [userLocation],
          destinations: [endLocation],
          travelMode: google.maps.TravelMode.DRIVING,
          unitSystem: google.maps.UnitSystem.IMPERIAL,
          avoidHighways: false,
          avoidTolls: false
        }, callback);
      }
      function callback(response, status) {
        if (status != google.maps.DistanceMatrixStatus.OK) {
          self.toggleProperty('errorState');
        } else {
          if (response.rows[0].elements[0].status === "ZERO_RESULTS") {
            self.toggleProperty('errorState');
          } else {
            var distance = response.rows[0].elements[0].distance;
            var distance_text = distance.text;
            self.set('milesAway', distance_text);
          }
        }
      }
      calculateDistance();
    });
  })
});

1 Ответ

0 голосов
/ 16 мая 2018

Несколько вещей выделяются ...

В вашем вычисляемом свойстве googleLocation отсутствуют его зависимости, что не позволит обновить его. По крайней мере, location должны быть перечислены.

Кроме того, вычисляемые свойства должны быть «чистыми функциями», поэтому они не имеют побочных эффектов при каждом выполнении. Таким образом, вместо установки milesAway в вычисляемой функции вы должны вернуть значение из вашей вычисляемой функции, которое также может быть названо milesAway. Я не могу комментировать слишком много в части вычисления расстояния, так как сам еще не сделал этого.

Вы должны удалить эту строку из своего кода:

milesAway: attr('string', {async: false}),

и сделайте что-то вроде следующей структуры:

milesAway: computed('location', function() {
    let location = this.get('location');

    // Your code to calculate the distance

    return distance;  
})

Однако модели в основном предназначены для постоянных данных, а не для данных переходных процессов. Число миль в зависимости от пользователя будет различаться (я вижу, что у вас есть жестко заданное местоположение пользователя, пока вы работаете над этим) для каждого виноградника, который использует эту модель. Итак, вы, вероятно, хотите переместить это вычисленное свойство из вашей модели в ваш компонент или контроллер. Итак, в вашем компоненте или контроллере вы должны иметь:

milesAway: computed('model.location', function() {
    let location = this.get('model.location');

    // Your code to calculate the distance

    return distance;  
})
...