Backbone.js中LeaderboardDeetsView视图未初始化问题修复求助
Backbone.js视图未初始化&数据获取失败问题修正
问题描述
我开发了一个简单的Backbone.js应用,从MySQL数据库获取用户数据,需在LeaderboardDeetsView视图中展示,目标是将数据填充到id为bbcontent的div中。但该视图未被调用,其initialize方法内的collection fetch操作也未执行,请求修正代码。
原HTML代码
<body> <div id="container"></div> <h1>Leaderboard</h1> <table class="table" id="modtable"> <tr> <th>Username</th> <th>Level</th> </tr> </table> <div id="bbcontent"></div> </body>
原Backbone代码
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"> </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.2.3/backbone-min.js"> </script> <script language="javascript"> $(document).ready(function() { alert("heyyyyyy") //model var User = Backbone.Model.extend({ idAttribute: "userId", defaults: { username: null, userLevel: null } }); //collection var Users = Backbone.Collection.extend({ model: User, url: "/CW2/ASSWDCW2/cw2app/index.php/Leaderboard/leaderboard", }); var usersC = new Users(); var LeaderboardDeetsView = Backbone.View.extend({ model: usersC, el: $('#bbcontent'), intialize: function() { alert("asndasnxdjksa") usersC.fetch({ async: false }) this.render() }, render: function() { var self = this; usersC.each(function(c) { var block = "<div class='name'><h1>" + c.get('username') + "</h1></div>" self.$el.append(block) }) } }) var leaderboardDeetsView = new LeaderboardDeetsView(); }); </script>
错误分析与修正方案
- 核心拼写错误:视图初始化方法
initialize被误写成intialize,导致初始化逻辑完全无法触发,这是视图没被调用的根本原因。 - 视图属性错误:关联集合应使用
collection属性而非model,原代码将集合赋值给model,不符合Backbone的视图-数据关联规范。 - 同步请求问题:
async: false会阻塞浏览器主线程,属于不推荐的写法,改用异步回调监听fetch完成事件更合理。 - 渲染时机问题:原代码直接在fetch后调用render,未考虑请求失败或数据未加载完成的情况,通过监听集合的
sync事件触发渲染更可靠。
修正后的完整代码
HTML部分(无修改)
<body> <div id="container"></div> <h1>Leaderboard</h1> <table class="table" id="modtable"> <tr> <th>Username</th> <th>Level</th> </tr> </table> <div id="bbcontent"></div> </body>
Backbone JavaScript部分
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"> </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.2.3/backbone-min.js"> </script> <script language="javascript"> $(document).ready(function() { alert("heyyyyyy") // Model定义 var User = Backbone.Model.extend({ idAttribute: "userId", defaults: { username: null, userLevel: null } }); // Collection定义 var Users = Backbone.Collection.extend({ model: User, url: "/CW2/ASSWDCW2/cw2app/index.php/Leaderboard/leaderboard" }); var usersC = new Users(); // 视图定义 var LeaderboardDeetsView = Backbone.View.extend({ // 关联集合而非model collection: usersC, el: $('#bbcontent'), // 修正拼写错误 initialize: function() { alert("asndasnxdjksa") // 监听集合同步事件,确保数据加载完成后渲染 this.listenTo(this.collection, 'sync', this.render); // 异步fetch,避免阻塞 this.collection.fetch({ error: function() { alert("数据加载失败") } }) }, render: function() { var self = this; // 清空容器后再渲染,避免重复添加 self.$el.empty(); this.collection.each(function(c) { var block = "<div class='name'><h1>" + c.get('username') + "</h1></div>" self.$el.append(block) }) return this; } }) // 实例化视图 var leaderboardDeetsView = new LeaderboardDeetsView(); }); </script>
内容的提问来源于stack exchange,提问作者Kavishka Rajapakshe
相关产品推荐
相关产品推荐

