2011-03-22 41 views
0

如何在Javascript或Dojo中實現觀察者模式。我已經用Dojo創建了課程當更改元素狀態時更改div(表示對象元素)背景顏色

dojo.declare("ELEMENT", null, { 

    _id:0, 
    _status:'' 

    constructor: function(id,status){ 
    this.id=id; 
    this.status=status; 
    }, 
    get_color:function(){ 

    }, 
    set_status:function(st){ 
    this._status=st; 
    } 
} 
}); 

並且我使用與元素相同的id創建div。當我改變元素的狀態時,我想改變div背景的顏色。如何實現這個,有沒有觀察這個問題?

+0

HTML元素ID必須是唯一的。 – Canuteson 2011-03-22 09:00:48

+0

它是獨一無二的。不要擔心身份證。 – Damir 2011-03-22 09:07:22

回答

1

使用Dojo 1.6。 Dijit有一個新的「手錶」功能,可以很好地滿足你的需求。它允許其他對象(即觀察者)動態添加將在類中的屬性更改時觸發的回調。

但是,你真的不想要一個觀察者模式。你想要的是在你的班上設置狀態時做些事情。這是確定性的;你並不是說任意數量的觀察者對象現在都對設置的狀態感興趣。

在這種情況下,您可以在該類中模擬地定義一個「_attributeMap」,該類自動將某些屬性/屬性映射到該類中DOM元素的屬性。在你的例子中,你可以在狀態屬性映射上聲明屬性映射到類的樣式。

您還可以提供_setXxxAttr函數來添加更多的功能而不是直接映射。

你的例子是不正確的道場。它應該是這樣的:

dojo.declare("ELEMENT", null, { 
    id: 0, 
    status: '', 
    /*constructor: no need. automatic.*/ 
    _setStatusAttr: function(value) { 
     this.status = value; 
     dojo.style("someDomNode", "background-color", value === 'foo' ? "yellow" : "blue"); 
    } 
}); 

var newelement = new ELEMENT({id:123, status:'hello'}); 
newelement.get("id"); // Get id = 123 
newelement.set("status", 'foo'); // Set status to 'foo'. _setStatusAttr is automatically run. 
newelement.get("status"); // Get status = 'foo' 

在道場的行話,_setXxxAttr自動重定向的set("xxx", value)通話。