2015-07-12 98 views
3

我有一個簡單的應用程序與模型,路線和控制器。我無法從控制器中訪問模型中的數據。我用燼-CLI所以我有以下結構:從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'); 
    } 
}); 

/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]')是不確定的。

如果我記錄整個模型對象並檢查它,我的所有數據都在那裏! ! 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 thingy工作。再次感謝! –

+0

@FilipNilsson ObjectController和ArrayController將成爲棄用。只用控制器。 http://emberjs.com/deprecations/v1.x/#toc_objectcontroller –

相關問題