Доступ к модели из контроллера в ember.js

У меня есть простое приложение с моделью, маршрутом и контроллером. Я не могу получить доступ к данным модели в моем контроллере. Я использую ember-cli, поэтому у меня следующая структура:

/app/router.js

var Router = Ember.Router.extend({
  location: config.locationType
});
Router.map(function() {
  this.route('logs',{path: '/'});
});
export default Router;

/app/routes/logs.js

export default Ember.Route.extend({
  controllerName: 'logs',
  model: function() {
    return this.store.find('logs');
  }
});

/app/models/logs.js

export default DS.Model.extend({
  ip: DS.attr('string'),
  timestamp: DS.attr('number'),
  visited_resource: DS.attr('string'),
  pretty_string: DS.attr('string')
});

/app/controllers/logs.js

export default Ember.Controller.extend({
  url: function() {
    var model = this.get('model');
    var basePath = "http://example.com";
    var path = model.visited_resource;
    return basePath+path
  }.property('visited_resource')
});

Моя проблема в том, что model.visited_resources, или же this.get('model.visited_resources') или же this.get('model.[any param]') не определено

Если я регистрирую весь объект модели и проверяю его, все мои данные там!!

Просто контроллер не может получить к нему доступ. Что я делаю неправильно?

1 ответ

Решение

Ваша модель представляет собой массив из просмотра этого скриншота (content: Array[5]), поэтому вам нужно получить первый объект, если вы хотите один элемент:

export default Ember.Controller.extend({
  url: Ember.computed('model', function() {
    var logs = this.get('model');
    var firstLog = logs.get('firstObject');
    var path = firstLog.get('visited_resource');
    var basePath = 'http://example.com';
    return basePath + path; 
  });
});

или перебрать каждый элемент и вернуть массив:

export default Ember.Controller.extend({
  urls: Ember.computed('model', function() {
    var logs = this.get('model');
    var basePath = 'http://example.com';
    var urls = logs.map(function(model) {
      var path = model.get('visited_resource');
      return basePath + path;
    });
    return urls;
   })
});

Чтобы создать вычисляемое свойство на модели, затем сделайте это на модели:

export default DS.Model.extend({
  ip: DS.attr('string'),
  timestamp: DS.attr('number'),
  visited_resource: DS.attr('string'),
  pretty_string: DS.attr('string'),
  url: Ember.computed('visited_resource', function() {
    var basePath = 'http://example.com';
    var path = this.get('visited_resource');
    return basePath + path;
  })
});

и вы будете иметь доступ к url свойство, как и любое другое свойство:

   export default Ember.Controller.extend({
      url: Ember.computed('model', function() {
        var logs = this.get('model');
        var firstLog = logs.get('firstObject');
        return firstLog.get('url');
      })
    })

Вы также можете явно установить модель, используя setupController:

export default Ember.Route.extend({
  controllerName: 'logs',
  model: function() {
    return this.store.find('logs');
  },
  setupController: function(controller, model) {
    controller.set('model', model);

    // or first item only
    controller.set('model', model.get('firstObject'));
  }
});
Другие вопросы по тегам