简体   繁体   中英

Load data from controller in ember.js

I want to implement a system that shows me the newest posts. For this I do not want to use the index action from the user as this is already taken for another post function but a "newest" action. It is showed on the index route with a {{ render "postNewest" }} call. I would prefer to load the data in the PostNewestController or PostNewestView instead of the route for abstraction reasons. I tried two ideas to achieve this, but none worked so far:

  • create a custom adapter and add a findNewest() method: the findNewest() method is sadly not found when trying to call in the init method of the controller.

  • write the request directly into the init method and then update with store.loadMany(payload) : data is successful request. However, I do not know how to access the data from the template and set the content of the controller.

Is there any way for this?

EDIT:

Here is the source code to better understand the problem:

PostModel.js

App.Post.reopenClass({
    stream: function(items) {
        var result = Ember.ArrayProxy.create({ content: [] });
        var items = [];
        $.getJSON("/api/v1/post/stream?auth_token=" + App.Auth.get("authToken"), function(payload) {
            result.set('content', payload.posts);
        });
        return result;
    }
});

PostStreamController.js

App.PostStreamController = Ember.ArrayController.extend({
    init: function() {
        this.set("content", App.Post.stream());
    },
});

index.hbs

{{# if App.Auth.signedIn}}
    {{ render "dashboard" }}
{{else}}
    {{ render "GuestHeader" }}
{{/if}}

{{ render "postStream" }}

postStream.hbs

{{#each post in model}}
    <li>{{#linkTo 'post.show' post data-toggle="tooltip"}}{{post.name}}{{/linkTo}}</li>
{{else}}
    Nothing's there!
{{/each}}

PostShowRoute.js

App.PostShowRoute = Ember.Route.extend({
    model: function(params) {
        return App.Post.find(params.post_id);
    },
    setupController: function(controller, model) {
        controller.set('content', model);
    },
});

I Had this issue too. Just add init in your controller, and define the model you want to get there.

In your Controller

App.PostRecentController = Ember.ArrayController.extend({
  init: function() {
    return this.set('content', App.Post.find({
      recent: true
    }));
  }
});

In your template

{{#each post in content}}
    {{post.body}}
{{/each}}

I would recommend you check EMBER EXTENSION, it will give you a good idea of the naming, and see if everything is missing.

I figured out the problem. The Post model has a belongsTo relationship to another model. This relationship is not loaded by Ember so in the stream() method I have to load this manually. Then everything works as expected.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM