Javascript 从主干网对GitHub API的Ajax调用
我正在探索主干网,在尝试从GitHub API检索JSON时遇到了一个问题。我正在创建一个快速的web应用程序,从GitHub Rails repo检索一个分页的未解决问题列表。我挂断的地方是调用检索包含问题第一页的JSON(暂时忘记分页) 我可以通过一个简单的jqueryajax调用获得问题的第一页,但这并没有正确地使用主干网Javascript 从主干网对GitHub API的Ajax调用,javascript,ajax,json,backbone.js,github-api,Javascript,Ajax,Json,Backbone.js,Github Api,我正在探索主干网,在尝试从GitHub API检索JSON时遇到了一个问题。我正在创建一个快速的web应用程序,从GitHub Rails repo检索一个分页的未解决问题列表。我挂断的地方是调用检索包含问题第一页的JSON(暂时忘记分页) 我可以通过一个简单的jqueryajax调用获得问题的第一页,但这并没有正确地使用主干网 $.getJSON("https://api.github.com/repos/rails/rails/issues?state=open", function(dat
$.getJSON("https://api.github.com/repos/rails/rails/issues?state=open", function(data) {...});
这是我的主干JavaScript——此时在一个文件中处理所有内容更容易
$(function() {
// Define namespace as RailsIssues
window.RailsIssues = {
Models: {},
Collections: {},
Views: {}
};
// Global function to simplify template property syntax
window.template = function(id){
return _.template( $('#' + id).html());
}
// Issue model
RailsIssues.Models.Issue = Backbone.Model.extend({
});
// IssueList collection
RailsIssues.Collections.Issues = Backbone.Collection.extend({
model: RailsIssues.Models.Issue,
/* not getting anything back */
url: "https://api.github.com/repos/rails/rails/issues",
parse: function(data){
return data;
}
});
// Issue view
RailsIssues.Views.Issue = Backbone.View.extend({
tagname: 'li',
template: template('issueTemplate'),
initialize: function(){
this.render();
},
render: function(){
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
// Issues view
RailsIssues.Views.Issues = Backbone.View.extend({
template: template('issuesTemplate'),
render: function(eventName) {
_.each(this.model, function(issue) {
var number = issue.attributes['number'];
//var title = issue.attributes['title'];
var xtemplate = this.template(issue.toJSON());
$(this.el).append(xtemplate);
}, this);
return this;
}
});
Backbone.sync = function(method, model) {
alert(method + ": " + model.url);
}
var issuesView = new RailsIssues.Views.Issues({ collection: RailsIssues.Views.Issues });
$(document.body).append(issuesView.render().el);
});
这是我的HTML——除了资源之外,这里真的没有什么有趣的东西。我只是尝试获取数据,并将其放入文档体中,稍后将进行样式设置
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script id="issuesTemplate" type="text/template">
<li><%= number %></li>
</script>
<script src="script/underscore.js"></script>
<script src="script/jquery-1.11.1.min.js"></script>
<script src="script/backbone.js"></script>
<script src="script/script.js"></script>
<title>Rails Issues</title>
</head>
<body>
<header>
Open Issues in Rails GitHub
</header>
</body>
</html>
Rails问题
Rails GitHub中的开放问题
在尝试检索JSON数据时,我遗漏了什么?代码只是默默地失败,什么也不返回,而上面的jQuery确实返回所需的JSON。您能提供的任何建议都会非常有用。我试图运行您的代码,但缺少
issuesTemplate
和issuesTemplate
,但是我注意到您实例化了视图,但从未实例化过集合或模型。而是将视图的集合指向视图问题的定义(而不是集合实例):
此外,创建新集合后,需要调用fetch()
,使主干执行API调用以收集所需的JSON。我建议您采取以下措施:
var issuesCollection = new RailsIssues.Collections.Issues();
issuesCollection.fetch(); // makes the GET request
var issuesView = new RailsIssues.Views.Issues({ collection: issuesCollection });
我一直无法找出问题中所示的代码错误,但在的帮助下,我终于能够让Ajax API调用正常工作 此代码仅检索结果的第一页(发布在上的问题),并在无序列表中显示问题编号 以下是HTML,它按正确的顺序包含模板和脚本标记:
<!DOCTYPE html lang="en">
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="https://assets-cdn.github.com/favicon.ico">
<script id="issuesTemplate" type="text/template">
<% $.each(issues, function() { %>
<li><%= this.number %></li>
<% }); %>
</script>
<script src="script/underscore.js"></script>
<script src="script/jquery-1.11.1.min.js"></script>
<script src="script/backbone.js"></script>
<script src="script/script.js"></script>
<title>Rails Issues</title>
</head>
<body>
<header>
Open Issues in Rails GitHub
</header>
<div class="theList">Loading... Please Wait.</div>
</body>
</html>
在上面的HTML中,第一个标记定义issuesTemplate。我缺少什么吗?我正在将模板与JavaScript中的集合视图相关联,例如Rails.Views.Issues=Backbone.view.extend({template:template('issuesTemplate')),…它依赖于脚本窗口顶部附近的小函数。template…它在设置模板属性时启用了更清晰的语法。我的代码笔上现在有一个扩展的、功能齐全的版本
<!DOCTYPE html lang="en">
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/x-icon" href="https://assets-cdn.github.com/favicon.ico">
<script id="issuesTemplate" type="text/template">
<% $.each(issues, function() { %>
<li><%= this.number %></li>
<% }); %>
</script>
<script src="script/underscore.js"></script>
<script src="script/jquery-1.11.1.min.js"></script>
<script src="script/backbone.js"></script>
<script src="script/script.js"></script>
<title>Rails Issues</title>
</head>
<body>
<header>
Open Issues in Rails GitHub
</header>
<div class="theList">Loading... Please Wait.</div>
</body>
</html>
var RI = {
run: function() {
this.listview = new this.listView();
this.issuescollection = new RI.issuesCollection();
this.router = new this.Router();
Backbone.history.start();
this.router.navigate('list_issues');
}
};
RI.Router = Backbone.Router.extend({
routes: {
'list_issues': 'renderListIssuesPage'
},
renderListIssuesPage: function () {
RI.listview.setElement('div.theList');
RI.listview.listIssuesPage();
}
});
RI.issueModel = Backbone.Model.extend({
});
RI.issuesCollection = Backbone.Collection.extend({
model: RI.issueModel,
url: 'https://api.github.com/repos/rails/rails/issues'
});
RI.listView = Backbone.View.extend({
el: 'div.theList',
template: _.template($('#issuesTemplate').html()),
initialize: function () {
_.bindAll(this, 'listIssuesPage', 'render');
},
render: function (response) {
var self = this;
this.$el.html(this.template({issues: response}));
},
listIssuesPage: function (querystring) {
var self = this;
RI.issuescollection.fetch({
data: querystring,
success: function(collection, response) {
self.render(response);
}
});
}
});
$(function() {
RI.run();
});