backbone.js视图在模型提取之前呈现

前端之家收集整理的这篇文章主要介绍了backbone.js视图在模型提取之前呈现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个小的backbone.js应用程序,但是对事物的顺序很难.

在我的html文件中,标题中有两个脚本块:@H_502_3@

  1. <script type="text/template" id="model-template">
  2. <a href="#"><%= title %></a>
  3. </script>
  4.  
  5. <script type="text/javascript">
  6. jQuery(function(){
  7. window.model.fetch();
  8. });
  9. </script>

在我的app.js中,我定义了一个简单的模型,视图和路由器.@H_502_3@

  1. (function($) {
  2.  
  3. window.MyModel = Backbone.Model.extend({
  4. url: '/mymodel'
  5. });
  6.  
  7. window.mymodel = new MyModel();
  8.  
  9. $(document).ready(function() {
  10.  
  11. window.MyModelView = Backbone.View.extend({
  12. template: _.template($('#mymodel-template').html()),initialize: function () {
  13. _.bindAll(this,'render');
  14. },render: function () {
  15. var renderedContent = this.template(this.model.toJSON());
  16. $(this.el).html(renderedContent);
  17. return this;
  18. }
  19. });
  20. });
  21.  
  22. window.MyApp = Backbone.Router.extend({
  23. routes: {
  24. '': 'home'
  25. },initialize: function () {
  26. this.myModelView = new MyModelView({
  27. model: window.mymodel
  28. });
  29. },home: function() {
  30. var $body = $('body');
  31. $body.empty();
  32. $body.append(this.myModelView.render().el);
  33. }
  34. });
  35.  
  36. $(function() {
  37. window.App = new MyApp();
  38. Backbone.history.start({pushState: true});
  39. });
  40.  
  41. })(jQuery);

该应用程序由简单的sinatra应用程序提供服务. url / mymodel提供静态json文件:@H_502_3@

  1. {
  2. "title": "My Model",}

加载应用程序时,我在javascript控制台中收到错误:@H_502_3@

  1. Uncaught ReferenceError: title is not defined

问题似乎是,视图在从服务器获取模型之前呈现自身.这是为什么?@H_502_3@

昨天,我关注了PeepCode的前两个backbone.js截屏视频.我试图将我的应用程序与截屏视频中的应用程序进行比较,但是看不出我的应用程序为什么需要工作的原因.@H_502_3@

有什么建议?@H_502_3@

解决方法

在这种情况下,您应该引导模型数据,以便在页面加载时可用.

代替@H_502_3@

  1. window.model.fetch();

把这样的东西放进去(如果使用.erb)@H_502_3@

  1. <script>
  2. window.model = new MyModel(<%= @model.to_json %>);
  3. </script>

否则,您需要在获取模型后呈现视图,例如@H_502_3@

绑定视图以在模型更改时进行渲染@H_502_3@

  1. initialize: function () {
  2. _.bindAll(this,'render');
  3.  
  4. this.model.on("change",this.render);
  5. },

或处理model.fetch的成功并呈现视图@H_502_3@

  1. window.model.fetch({
  2. success: function (model,response) {
  3. window.MyApp.myModelView.render();
  4. }
  5. });

猜你在找的JavaScript相关文章