2012-04-04 81 views
1

我开始学习骨干用这个简单的例子:当“添加”按钮被按下简单的骨干例如没有更新的观点

<div id="counter">unkown</div> 
<button id="add-button">ADD</button> 

(function($){ 

    var Counter = Backbone.Model.extend({ 
    defaults: { 
     count: 0    
    } 
    }); 

    var CounterView = Backbone.View.extend({ 
     el: "#counter", 

     events: { 
      "click #add-button": "add" 
     }, 

     add: function() { 
      this.model.count++; 
      render(); 
     }, 

     render: function() { 
      $(this.el).text(this.model.get("count")); 
      return this; 
     }, 

     initialize: function(){    
      this.render(); 
     } 
    }); 

    var counterItem = new Counter(); 
    var counterView = new CounterView({model: counterItem});    

}(jQuery)); // function($) 

所以计数器应该增加,认为应该更新。我绑定了视图和模型,并将click事件与add函数关联,但不知何故,这不起作用。

所以我想我做错了什么或我只是缺少一些约束?

编辑:固定的建议这个......仍然没有工作:

<div class="list"> 
     <div id="counter">unkown</div> 
     <button id="add-button">ADD</button> 
</div> 

    (function($){ 

     var Counter = Backbone.Model.extend({ 
     defaults: { 
      count: 0    
     } 
     }); 

     var CounterView = Backbone.View.extend({ 
      el: "#counter", 

      events: { 
       "click #add-button": "add" 
      }, 

      add: function() { 
       alert("ADD"); 
       this.model.set("count", this.model.get("count") + 1); 
       this.render(); 
      }, 

      render: function() { 
       $(this.el).text(this.model.get("count")); 
       return this; 
      }, 

      initialize: function(){    
       this.render(); 
      } 
     }); 

     var counterItem = new Counter(); 
     var counterView = new CounterView({model: counterItem});      

    }(jQuery)); // function($) 

编辑:固定和工作

<div id="counterHolder"> 
     <div id="counter"> 
      <span>unknown</span> 
      <button id="add-button">ADD</button> 
     </div> 
    </div> 

    <script> 


    (function($){ 

     var Counter = Backbone.Model.extend({ 
     defaults: { 
      count: 0    
     }, 

     increase: function(){ 
      this.set("count", this.get("count") + 1); 
     } 
     }); 

     var CounterView = Backbone.View.extend({ 

      el: "#counter", 

      events: { 
       "click #add-button": "add" 
      }, 

      add: function() { 
       this.model.increase();    
      }, 

      render: function() { 
       $("#counter span").text(this.model.get("count")); 
       return this; 
      }, 

      initialize: function(){ 
       this.render = _.bind(this.render, this); 
       this.render(); 
       this.model.bind('change:count', this.render); 
      } 
     }); 

     var counterItem = new Counter(); 
     var counterView = new CounterView({model: counterItem});      

    }(jQuery)); // function($) 

    </script> 
+0

如果你甚至无法获得最简单的示例运行并需要发布求助信息,那就太令人讨厌了。我正在使用Batman.js。 Buh-bye Backbone! – Ringo 2012-08-12 17:11:46

+0

这显示了我未定义的'$(“#counter span”).text(this.model.count);'如何访问模型的直接属性,例如'this.model.count' – imdadhusen 2013-06-10 05:42:41

+0

模型属性通过get call来访问(看看Backbone文档)... this.model.get(“count”) – Drejc 2013-06-10 06:42:19

回答

5

按钮必须是视图的el

更新的后裔,你的HTML像下面,它应该工作

<div id="counter"> 
    <button id="add-button">ADD</button> 
</div> 

如果你仍然想显示的数量,然后添加一个额外的span

<div id="counter"> 
    <span id="count" /> 
    <button id="add-button">ADD</button> 
</div> 

并更新您的渲染方法

render: function() { 
    this.$('#count').text(this.model.get("count")); 
    return this; 
} 
+0

这就是它...已经尝试:this.model.bind('change:count',this.render);在初始化函数中,但没有运气。 – Drejc 2012-04-04 13:19:48

+0

也试过了这个:initialize:function(){this.render();} this.model.bind('change:count',this.render); }但它失败:Uncaught TypeError:无法调用未定义的方法'get',任何想法为什么? – Drejc 2012-04-04 13:33:01

+0

不知道你为什么得到未定义的错误。该语法看起来正确。 – Paul 2012-04-04 14:51:11

0

骨干车型必须通过操纵其数据getset方法,而不是普通的javascript对象。尝试

this.model.set("count", this.model.get("count") + 1); 

或者更好的是,添加一个increment方法是通过更新和getset的属性更好的封装模型类。

此外,只是关于约定的一个注释,通常每个视图更改或绑定的DOM块都应包含在父元素el中。您的视图绑定到未包含在视图的父项div中的添加按钮。它似乎在工作,但它基本上是全局变量的等价事件处理。

+0

看看我的编辑..修正应用建议,但仍然没有运气alert()不被调用。 – Drejc 2012-04-04 12:59:07

+0

实际上,该语法应该看起来更像: this.model.set({'count':this.model.get('count')+ 1}); – andyengle 2013-12-19 20:44:28

+0

不是,'set('key',value)'和'set({key:value})'是正确的替代语法。前者与'get('key')'很好地配对。 http://documentcloud.github.io/backbone/docs/backbone。html#section-41 – 2013-12-20 07:04:39

0

我认为你的错误是一个简单的JavaScript错误。在add您需要拨打this.render()而不仅仅是render()

+0

看看我的编辑..修复应用为建议,但仍然没有运气 – Drejc 2012-04-04 12:58:17