自定义BackboneJS事件(增量和减量)不起作用

x6492ojm  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(134)

我有一个计数器(产品的数量),我想使用backboneJS自定义事件操作。如果我单击添加产品,那么产品的数量应该增加,如果我单击删除产品,那么产品的数量应该减少一。Demo here问题是,计数器的值没有得到更新,当我单击按钮。这里是代码片段

var Counter = Backbone.Model.extend({
 defaults: { value: 10 },

 // model methods
 increment: function() { 
   this.set({value: this.get('value')+1});
 },
 decrement: function() {
   this.set({value: this.get('value')-1});
 }
});
var cnt = new Counter();
// ------- view ------- 
var AppView = Backbone.View.extend({
 el:'#no_of_products',
 render: function() {
   this.$el.html(this.model.get('value'));
 },

 events:{
   'click .add-one': 'addOne',
   'click .minus-one': 'minusOne'
 },
 initialize: function() {
   this.model.on('change', this.render, this);
   this.render();
 },

 // view methods
 addOne: function() {
   this.model.increment();
 },
 minusOne: function() {
   this.model.decrement();
 }
});
var view = new AppView({ model: cnt });

html代码是:

<div id="product_details">
<h1>No of Products:<span id="no_of_products">0</span></h1>
<table>
  <tr>
    <td>
      Add Product
    </td>
    <td>
     : <button class="add-one">+1</button>
    </td>
  </tr>
  <tr>
    <td>
      Remove Product
    </td>
    <td>
      : <button class="minus-one">- 1</button>
    </td>
  </tr>
</div>
eqqqjvef

eqqqjvef1#

下面是一个工作示例:https://codepen.io/tilwinjoy/pen/OJPyNbR?page=1&
几乎没有什么问题:
1.你试图绑定事件的元素必须在视图的内部。在你的例子中,视图元素只是一个<span>,所有的东西都在外面。

  1. Backbone.js 没有双向绑定(尽管有一些扩展可以提供这种功能),因此在更新模型后,您必须自己重新渲染视图
l7wslrjt

l7wslrjt2#

下面的代码将修复测试用例的问题,但是,如果在浏览器中运行它,它将不起作用,但是谁在乎这是否有助于清除测试;)只是修改了代码以清除测试用例。

var Counter = Backbone.Model.extend({
  defaults: { no_of_products: 10 }
});
var cnt = new Counter();
// ------- view -------
var AppView = Backbone.View.extend({
  el:'#product_details',
  render: function() { this.$('#no_of_products').html(this.model.get('no_of_products'));
  },

  events:{
    'click .add-one': 'addOne',
    'click .minus-one': 'minusOne'
  },
  initialize: function() {
    this.model.on('change', this.render, this);
    this.render();
  },

  // view methods
  addOne: function() {
    this.model.set({no_of_products: this.model.get('no_of_products')+1});
    this.render();
  },
  minusOne: function() {
    this.model.set({no_of_products: this.model.get('no_of_products')-1});
    this.render();
  }
});
var view = new AppView({ model: cnt });

相关问题