2012-09-18 26 views
9

sự khác biệt giữa một id và dữ liệu võ đường-id trong thẻ võ đường như thế này là gì:Sự khác nhau giữa id và dữ liệu võ đường-id

<button id="save" data-dojo-type="dijit/form/Button" type="button" data-dojo-attach-event="onClick:save">Save</button> 

tôi cố gắng tham khảo nút này để thay đổi nó nhãn với: var myButton = dijit.byId ("lưu"); để tôi có thể thay đổi nhãn nút myButton.set ("label", "Add New");

Nếu tôi sử dụng id = "save" nó hoạt động. Nếu tôi chỉ sử dụng data-dojo-id = "save" thì nó không hoạt động.

Tôi khá mới với Dojo nên giải thích hoặc hướng dẫn bạn có thể chỉ cho tôi sẽ được đánh giá cao!

Trả lời

12

data-dojo-id gán phụ tùng trong namespace toàn cục, tức là vào window đối tượng:

<button data-dojo-id="save" data-dojo-type="dijit/form/Button">Save</button>​ 

vì vậy bạn có thể truy cập vào nút trực tiếp:

save.set("label", "Add New"); 

Xem sự khác biệt trong hành động ở jsFiddle: http://jsfiddle.net/phusick/7yV56/

EDIT: Để trả lời câu hỏi của bạn. Tôi hoàn toàn không sử dụng data-dojo-id. Nó gây ô nhiễm không gian tên toàn cầu mà ngược lại trực tiếp với những gì AMD làm. Dù sao, bạn vẫn có thể sử dụng giống như widgets.savewidgets.rename để giảm thiểu ô nhiễm môi trường:

<button data-dojo-id="widgets.save" data-dojo-type="dijit/form/Button">Save</button>​ 
<button data-dojo-id="widgets.rename" data-dojo-type="dijit/form/Button">Rename</button>​ 

IMO, data-dojo-id là có cho progressive enhancement, không cho các ứng dụng đầy đủ chính thức.

data-dojo-id chỉ gán một phiên bản cho biến, do đó, với nhiều dijits có cùng số data-dojo-id biến sẽ trỏ đến giá trị được chỉ định cuối cùng (tức là nó sẽ không phải là mảng).

Bạn có thể tránh sử dụng rộng rãi registry.byId viết phương thức của mình để nhận tiện ích theo nhu cầu của bạn. Cách tốt nhất để bắt đầu là dijit/registy.findWidgets(rootNode, skipNode). Xin lưu ý, rằng dojo/parser.parse(rootNode, options) trả về một mảng các đối tượng khởi tạo, hoặc chính xác hơn:

Trả về một đối tượng pha trộn đó là một mảng của các đối tượng khởi tạo, nhưng cũng có thể bao gồm một lời hứa mà đã được giải quyết với instantiated các đối tượng. Điều này được thực hiện cho khả năng tương thích ngược. Nếu trình phân tích cú pháp các mô-đun tự động yêu cầu, mô-đun sẽ luôn hoạt động theo kiểu hứa hẹn và sử dụng parser.parse().then(function(instances){...}).

Một ví dụ về một phương pháp tôi sử dụng để gán dijits ContentPane của thành tài sản của mình widgets, đó là một đối tượng:

_attachTemplateWidgets: function(widgets) { 
    widgets = widgets || this.getChildren(); 
    for(var each = 0; each < widgets.length; each++) { 
     var widget = widgets[each]; 
     var attachPoint = widget.params.dojoAttachPoint; 
     if(attachPoint) { 
      this.widget[attachPoint] = widget; 
     } 

     var children = widget.getChildren(); 
     if(children.length > 0) { 
      this._attachTemplateWidgets(children); 
     } 
    } 
} 

tôi đặt toàn bộ lớp ở đây: https://gist.github.com/3754324. Tôi sử dụng số này app.ui._Pane thay vì dijit/layout/ContentPane.

+0

Cảm ơn Phusick! Chỉ sử dụng thuộc tính id yêu cầu sử dụng phương thức byId để lấy móc DOM.Bây giờ tôi tự hỏi đó là tốt hơn để sử dụng trong một mô-đun Dojo nơi bạn đang tạo ra nhiều trường hợp. Liệu data-dojo-id có quan tâm đến việc quản lý nội bộ nên một bản sắc thể hiện không bị nhầm lẫn với một định dạng khác không? – teaman

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