基于另一个属性为当前控制器重新加载模型的最佳方法是什么?
例如:我有一个帖子控制器。作者只能有一个帖子。如果currentAuthor属性发生变化,我想重新加载post创建表单。
我试过这种方式:
App.PostEditController = Ember.ObjectController.extend
modelReloadNeeded: Ember.observer((obj, keyName) ->
postId = @get('currentAuthor').get('post_id')
if postId?
@set('model', @store.find('post', postId))
, 'currentAuthor.post_id'
)
它会重新加载所有内容,但不会返回真正的模型,而是承诺。 而且看起来它不像惯用的Ember解决方案。
也许有更好的方法来解决这个问题?
答案 0 :(得分:1)
我相信重装控制器模型相当于重新进入相同的路线。因此,从2.12.0开始,有很多可能性,
刷新此路线和任何子路线上的模型,触发beforeModel,model和afterModel挂钩,其方式与从其他路线转换时输入路线的方式类似。
Router.map(function() { this.route('posts'); this.route('post', { path: '/post/:post_id' }); });
并且您可以说this.transitionTo('post',123)
这将刷新当前路线,您将在模型钩子中获得123作为参数。
https://guides.emberjs.com/v2.12.0/routing/defining-your-routes/#toc_dynamic-segments http://emberjs.com/api/classes/Ember.Route.html#method_transitionTo
import Ember from 'ember'; export default Ember.Route.extend({ queryParams: { postId: { refreshModel: true } }, model(params) { //You will get query parameters value from the url through params.postId return this.get('store').query('article', params); } });
你甚至可以在控制器中提到与queryParams相同的postId。当您设置postId
属性时,它将刷新路径。
import Ember from 'ember';
export default Ember.Controller.extend({
queryParams: ['postId'],
postId: null, //here is the default value. default value will not be shown in URL.
});
https://guides.emberjs.com/v2.12.0/routing/query-params/#toc_opting-into-a-full-transition
答案 1 :(得分:0)
我很紧张地为你解决这个问题,因为我不确定你是否正确接近它,但是:
App.PostEditController = Ember.ObjectController.extend({
modelReloadNeeded: function () {
this.get('content').reload();
}.observes('currentAuthor')
});
这应该重新加载PostEditController
的内容属性,因此只要内容的currentAuthor
属性发生更改,就会更新模板。
答案 2 :(得分:0)
这样的内容会找到不同的帖子,然后将其设置为PostEditController
的内容。
App.PostEditController = Ember.ObjectController.extend({
modelReloadNeeded: function () {
// Find another post based on author id, tweak to suit your needs
var otherPost = this.store.find('post',{ author_id : this.get('currentAuthor.id') })
this.set('content', otherPost );
}.observes('currentAuthor')
});
答案 3 :(得分:0)
store.find
会给你一个承诺,所以你应该解决它以避免没有方法调用的问题
App.PostEditController = Ember.ObjectController.extend
modelReloadNeeded:(->
postId = @get('currentAuthor').get('post_id')
if postId?
@store.find('post', postId).then (post) =>
@set('content', post)
).observes('currentAuthor.post_id')