繁体   English   中英

在同一路由上管理Ember多个RSVP承诺

[英]Manage Ember Multiple RSVP Promises on the same route

我正在使用GitHub API,以按特定路线加载模型

我正在做两个承诺,一个用于我的个人github详细信息: https : //api.github.com/users/user ,另一个用于我的GitHub存储库https://api.github.com/users/user/repos

我可以分别加载模型,但问题是我不知道如何在我的特定路线中同时加载两个模型。

看代码

var IndexRoute = Ember.Route.extend({
    model: function(params) {
        var url, self, git;
        self = this;
        git = this.store.createRecord('git',{});
        url = 'https://api.github.com/users/user';
        return new Ember.RSVP.Promise(function(resolve, reject) {
            return Ember.$.getJSON(url, function(data) {
                var item = [];
                git.setProperties({
                    name: data.name,
                    login: data.login,
                    location: data.location,
                    company: data.company,
                    followers: data.followers,
                    following: data.following
                });
                item.pushObject(git);
                return resolve(item);
            });
        });
    },
    model: function(params){
        var self, url, repoListProxy;
        self = this;
        url = 'https://api.github.com/users/user/repos';
        repoListProxy = Ember.ArrayProxy.create({
            content: []
        });
        return new Ember.RSVP.Promise(function(resolve, reject) {
            return Ember.$.getJSON(url, function(repos) {
                if (repos.length) {
                    repos.toArray().forEach(function(item, index, arr){
                        var repo;
                        repo = self.createReposList(item, repoListProxy);
                    });
                    repos = repoListProxy.get('content');
                    return resolve(repos);
                }
            });
        });
    },
    createReposList: function(repo, arr){
        var record
        record = this.store.createRecord('repo',{}),
        record.setProperties({
            name: repo.name,
            description: repo.description
        })
        arr.pushObject(record);
        return record;
    },
});

如何在我的特定路线中使用Ember.RSVP.Promise加载这些多个模型?

由于您发布的代码太长而无法阅读,因此我没有基于此实现解决方案。 这是在模型挂钩中的单个路径中加载多人答应的一个常见示例。

   model: function() {
        var store = self.get('store');
        var someRecord = store.createRecord('foo/bar', {});
        var somePromise = imported_promise(someRecord);

        return Ember.RSVP.hash({
            accessRights: somePromise,
            itemData: somePromise.then(function(resolved) {
                 // Do something here, promise is resolved. 
            })
            myRecord: someRecord,
        });
    },

现在,如果您需要从模板或控制器中的route访问任何内容。

您将首先引用模型,然后引用属性。

{{model.myRecord}}this.get('model.myRecord')

既然你是个讨厌我的好人,所以我决定为你写。

当您无法使用store.find时,我建议使用Ic-AJAX: https : //github.com/rwjblue/ember-cli-ic-ajax进行异步调用

model: function() {
        var store = this.get('store');


        var userUrl = 'https://api.github.com/users/user';
        var reposUrl = 'https://api.github.com/users/user/repos';

        var usersPromise = function() {
            return ic.ajax.request(userUrl).then(function(data) {
                return store.createRecord('git', {
                    name: data.name,
                    login: data.login,
                    location: data.location,
                    company: data.company,
                    followers: data.followers,
                    following: data.following
                })
            };
        };

        var repositoriesPromise = function() {
            return ic.ajax.request(reposUrl).then(function(repos) {
                return repos.map(function(repo) { // map returns new array no need to write container = [] . container.push(bla)
                    return store.createRecord('repos', {
                        name: repo.name,
                        description: repo.description
                    });
                })
            };
        }

        return Ember.RSVP.hash({
            users: usersPromise,
            repositories: repositoriesPromise
        });

    },

由于您仍在使用其他方法,因此我继续搜索了其语法

   var gituserPromise = function() {
            return Ember.$.ajax(userUrl, {

    success: function(data) {
        return store.createRecord('git', {
                    name: data.name,
                    login: data.login,
                    location: data.location,
                    company: data.company,
                    followers: data.followers,
                    following: data.following
                })
    },
    error: function(reason) {
       reject(reason);
    }});
};

        return Ember.RSVP.hash({
            gitUser: gituserPromise()  
        });

在hbs中,我现在可以执行{{model.gitUser.name}}

指向它的新链接http://emberjs.jsbin.com/rutezi/2/edit?html,js,输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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