Trucks模型由db支持,可通过rest api访问。 但是,Analysis模型不受db支持,而只是用于客户端的计算。
我需要从Analyzes控制器中访问Trucks数组,但我遇到了2个问题
需要从数据库中检索卡车数据。如果我立即访问/analyses
路由,那么在检查ember控制台时数据存储中没有Trucks。但是,如果我首先访问/trucks
,那么我会注意到在数据存储中检索了6条记录。
在AnalysesController
内部我已经指定了对Trucks的依赖,但是我无法从控制器中访问数据。 http://emberjs.com/guides/controllers/dependencies-between-controllers/显示了如何从模板中进行访问。
以下是代码
// router.js
Classmove.Router.map(function() {
this.resource('trucks');
return this.resource('analyses');
});
Classmove.TrucksRoute = Ember.Route.extend({
model: function() {
return this.store.find('truck');
}
});
Classmove.Analyses = Ember.Route.extend({
model: function() {
return this.store.find('analysis');
}
});
// analyses_controller.js
Classmove.AnalysesController = Ember.ArrayController.extend({
needs: ['trucks'],
trucks: Ember.computed.alias('controllers.trucks'),
isCalculating: false,
checkTrucks: function() {
// I want to access the trucks here
// I found that I was able to access it like so
this.get('trucks').model.content
// but shouldn't there be a direct way without bypassing Ember
},
actions: {
calculate: function() {
// does stuff - removed from example for simplicity
}
}
});
答案 0 :(得分:0)
我发现这个答案有用EmberJS: How to load multiple models on the same route?
路由器等待承诺在beforeModel
,model
和afterModel
挂钩上完成。
在我的示例中,afterModel
挂钩返回promises的哈希值。在履行承诺后,它会在trucks
上设置locations
和AnalyzeRoute
属性。承诺完成后,调用setupController
钩子,我们从AnalyzeRoute
读取属性并在控制器上设置它们。
我没有从其他控制器读取数据。我正在从商店中读取数据,因为在调用TrucksController
路由之前可能未访问/analyze
因此可能未设置其模型属性。
// router.js.coffee
App.AnalyzeRoute = Ember.Route.extend
model: -> @store.all('location-analysis') # don't fetch from server, checks local store
afterModel: ->
Ember.RSVP.hash
trucks: @store.find('truck').then (trucks) => @set('trucks', trucks)
locations: @store.find('location').then (locations) => @set('locations', locations)
setupController: (controller, model) ->
this._super(controller, model)
controller.set 'trucks', @get('trucks')
controller.set 'locations', @get('locations')
// analyze_controller.js
App.AnalyzeController = Ember.ArrayController.extend
checkTrucks: ->
trucks = @get('trucks') # returns an Ember Record Array
# do some checking
actions:
calculate: ->
// does stuff - removed from example for simplicity