2015-07-12 2 views
3

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

/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'); 
    } 
}); 

/приложение/модели/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]') не определено.

Если я зарегистрирую весь объект модели и осмотрю его, все мои данные есть! ! http://i.stack.imgur.com/nkvyT.png

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

+1

Ваша модель представляет собой массив, таким образом, ваши журналы контроллер должен быть расширен от 'ArrayController', и каждая вещь встанет на свои места. – guleria

ответ

2

Ваша модель является массивом, глядя на этот скриншот (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')); 
    } 
}); 
+0

Спасибо! Я совершенно неправильно думал о том, как это работает. Я изменил его, чтобы вместо этого стать ArrayController. Теперь я пытаюсь заставить весь объект ObjectController работать. Еще раз спасибо! –

+0

@FilipNilsson ObjectController и ArrayController станут устаревшими. Используйте только контроллер. http://emberjs.com/deprecations/v1.x/#toc_objectcontroller –

Смежные вопросы