2012-02-24 29 views
8

Tôi nghĩ rằng những gì tôi muốn làm là khá đơn giản, tôi chỉ không biết làm thế nào để làm điều đó. Tôi muốn kích hoạt sự kiện của riêng mình khi một trong các mô hình của tôi quy đổi các thay đổi cho mục đích chuyển một số dữ liệu tới trình xử lý sự kiện (cho dù thay đổi là tăng hoặc giảm giá trị).Ghi đè một mô hình xương sống Thay đổi sự kiện

Về cơ bản tôi muốn xử lý của tôi để làm điều này trong giao diện

handler: function(increased) { 
    if(increased) { 
     alert("the value increased") 
    } 
    else { 
     alert("the value decreased") 
    } 
} 

// ... 

this.model.on("change:attr", this.handler, this); 
+1

Điều gì không hoạt động? – tkone

+0

hmmm có lẽ câu hỏi của tôi không rõ ràng, tôi muốn biết làm thế nào tôi có thể truyền dữ liệu đến trình xử lý 'change: attr', ngay bây giờ sự kiện đó đang bị" tự động "kích hoạt, bất cứ khi nào tôi gọi' set() 'trên mô hình. – Matthew

+0

Bạn muốn truyền dữ liệu nào? Bạn sẽ có quyền truy cập vào mô hình đã có và bạn sẽ biết thuộc tính nào đã được thay đổi. – tkone

Trả lời

12

Ở đây bạn đi: Về cơ bản, bạn nghe change:myvar. Khi thay đổi xảy ra, bạn sử dụng số previous() của mô hình để lấy giá trị cũ. Tùy thuộc vào việc nó tăng hay giảm, bạn kích hoạt sự kiện thích hợp. Bạn có thể nghe những sự kiện này như được hiển thị trong initialize().

(function($){ 

    window.MyModel = Backbone.Model.extend({ 

     initialize: function() { 
      this.on('change:myvar', this.onMyVarChange); 
      this.on('increased:myvar', function() {     
       console.log('Increased');     
      }); 
      this.on('decreased:myvar', function() {     
       console.log('Decreased');     
      }); 
     }, 

     onMyVarChange: function() { 
      if (this.get('myvar') > this.previous('myvar')) { 
       this.trigger('increased:myvar'); 
      } else { 
       this.trigger('decreased:myvar'); 
      } 
     }    
    }); 

    window.mymodel = new MyModel({myvar: 1}); 
    mymodel.set({myvar: 2}); 
    mymodel.set({myvar: 3}); 
    mymodel.set({myvar: 1}); 

})(jQuery);​ 

Chạy ở trên sẽ in "Tăng", "Tăng", "Giảm" vào bảng điều khiển của bạn.

+0

Điều này trông giống như một giải pháp rất tốt đẹp. Sẽ kiểm tra nó ra và trở lại ya ... – Matthew

+0

hoạt động tuyệt vời, được chấp nhận – Matthew

+0

Hoạt động khá tốt, cảm ơn những người đứng lên. Đối với trường hợp của tôi, tôi cần phát hiện sự kiện trong chế độ xem có mô hình được đính kèm. Vì vậy, sự kiện 'change: attribute_name' đã được kích hoạt ngay cả khi mô hình được gắn vào khung nhìn ngoài khi giá trị mô hình thay đổi từ đầu vào DOM. Vì vậy, tôi đã phải kiểm tra nếu 'this.model.get ('attribute_name')' là 'null' để tránh phát hiện sự kiện được kích hoạt trong phương thức' initialize'. – codarrior

0

gì nếu bạn bắn kiện tùy chỉnh của riêng bạn sau khi nghe sự kiện thay đổi?

handler: function(increased) { 
    this.model.trigger('my-custom-event', stuff, you, want); 
}, 
myHandler: function(stuff, you, want){ 
    // Do it... 
} 
// ... 
this.model.on("change:attr", this.handler, this); 
this.model.on('my-custom-event, this.myHandler, this); 
2

Chỉ cần nhìn vào previousAttributes()

Sau đó bạn có thể so sánh:

If(this.get(attr) > this.previousAttributes()[attr]){ 
    console.log('bigger'); 
} else { 
    console.log('smaller'); 
} 

Nếu bạn sử dụng trong xử lý sự kiện change của bạn, bạn đã cài đặt xong. Không cần kích hoạt tùy chỉnh hoặc tấn mã.

EDIT

Đây là từ dự án Backbone.Validators của tôi và làm thế nào tôi có được danh sách của tất cả các thuộc tính đó đã thay đổi trong bước xác nhận:

var get_changed_attributes = function(previous, current){ 
    var changedAttributes = []; 
    _(current).each(function(val, key){ 
     if(!_(previous).has(key)){ 
      changedAttributes.push(key); 
     } else if (!_.isEqual(val, previous[key])){ 
      changedAttributes.push(key); 
     } 
    }); 
    return changedAttributes; 
}; 

Điều này đòi hỏi gạch 1.3.1 vì nó sử dụng _.has. Nếu bạn không thể nâng cấp đó là một điều dễ dàng để thay thế mặc dù. Trong trường hợp của bạn, bạn sẽ đi qua this.previousAttributes()this.attributes

+0

điều này trông giống như những gì @ggozad đã đưa ra. Tôi chấp nhận của mình bởi vì tôi thích ý tưởng nghe 'this.on ('thay đổi: attr'' và bắn một sự kiện tùy chỉnh trong xử lý. Cảm ơn sự giúp đỡ của bạn mặc dù :) – Matthew

+0

@matthew Yup. Đó là cách tốt nhất để làm điều đó.Ý tưởng cho điều này là bạn có thể làm điều đó một cách tổng quát bằng cách so sánh các thuộc tính giúp dễ dàng sử dụng lại nếu bạn cần. Cảm ơn vì bạn đã phản hồi! – tkone

Các vấn đề liên quan