在同一路由上管理 Ember 个 RSVP 承诺
Manage Ember Multiple RSVP Promises on the same route
我正在使用 GitHub API 以在特定路径中加载模型
我正在履行两项承诺,一项是针对我的个人 github 详细信息:https://api.github.com/users/user and the other one for my GitHub repositories 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,
});
},
现在,如果您需要从模板或控制器中的路由访问任何内容。
您将首先参考模型,然后是 属性。
{{model.myRecord}} 或 this.get('model.myRecord')
因为你是个好人,对我投了反对票,所以我决定为你写。
我建议使用 Ic-AJAX : https://github.com/rwjblue/ember-cli-ic-ajax 当你不能使用 store.find
时进行异步调用
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}}
新 link 它 http://emberjs.jsbin.com/rutezi/2/edit?html,js,output
我正在使用 GitHub API 以在特定路径中加载模型
我正在履行两项承诺,一项是针对我的个人 github 详细信息:https://api.github.com/users/user and the other one for my GitHub repositories 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,
});
},
现在,如果您需要从模板或控制器中的路由访问任何内容。
您将首先参考模型,然后是 属性。
{{model.myRecord}} 或 this.get('model.myRecord')
因为你是个好人,对我投了反对票,所以我决定为你写。
我建议使用 Ic-AJAX : https://github.com/rwjblue/ember-cli-ic-ajax 当你不能使用 store.find
时进行异步调用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}}
新 link 它 http://emberjs.jsbin.com/rutezi/2/edit?html,js,output