2012-05-25 34 views
18

Có thể lấy được phần tử (hoặc các phần tử) tương ứng mà một cá thể dữ liệu (mô hình) đã được ràng buộc không?KnockoutJs: Lấy phần tử bị ràng buộc từ một cá thể mẫu

Ví dụ, tôi có một mảng các đối tượng 'Người' lưu trữ trong thuộc tính ViewModel.

tôi ràng buộc ViewModel đến xem mà ám nó, ví dụ:

<div class="people" data-bind="template: { foreach: people }"> 
    <a href="#" class="person" data-bind="text: name"></a> 
</div> 

tôi sau đó ràng buộc một số xử lý sự kiện thông qua jQuery:

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this)); 
}); 

Trong phương pháp showPerson tôi, tôi sẽ tiết kiệm được tham chiếu đến mô hình. Tôi/có thể/cũng lưu một tham chiếu đến phần tử, nhưng tôi không muốn nếu tôi không phải làm như vậy.

self.showPerson = function(person) { 
    // can i get the corresponding element from the 'person' model? 
}; 

Có ai có ý tưởng nào không?

Trả lời

8

Cú pháp của bạn và sử dụng $ container với jquery và đối số thứ hai của '.person' là unfamil iar với tôi, nhưng trong trình xử lý nhấp chuột của bạn, không phải là this yếu tố đã được nhấp? Bạn không thể chuyển nó đến phương thức showPerson của bạn được không?

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this), this); 
}); 

self.showPerson = function(person, element) { 
    // can i get the corresponding element from the 'person' model? 
}; 

Tôi không biết cách nào có thể quan sát được, nhưng có thể là một vài yếu tố khác nhau. Bạn có thể có một hộp văn bản cho 'tên', hiển thị tên trong một khoảng, sử dụng nó trong một tính toán, có thuê bao, và sử dụng tên() chiều dài trong một tính toán trong một ràng buộc ví dụ.

Điều đó nói rằng, nếu bạn sử dụng phiên bản gỡ lỗi loại trực tiếp, bạn có thể thấy rằng các quan sát của bạn có thuộc tính _subscriptions có thể có những gì bạn đang tìm kiếm. Các phiên bản rút gọn là một số nhân vật duy nhất tôi nghĩ.

+0

Cảm ơn bạn đã trả lời. Tất nhiên cách dễ nhất để làm điều này là để lưu một tham chiếu đến phần tử, nhưng trong câu hỏi của tôi, tôi đã đề cập tôi không muốn làm điều này nếu tôi không phải làm vậy. Nhưng tôi nghĩ rằng câu trả lời của bạn đã xác nhận rằng không thể có được một danh sách các yếu tố quan sát được ràng buộc, mà tôi cảm thấy là thiếu phương pháp phương pháp API của knockoutjs. – badsyntax

5

Tại sao không di chuyển liên kết sự kiện nhấp chuột bên trong foreach của bạn?

<a href="#" class="person" data-bind="text: name, click: showPerson"></a>

Trong trường hợp này, chức năng showPerson() của bạn sẽ có những dữ liệu chính xác cho person

EDIT:

Xin lỗi, nhưng tôi đoán tôi bị mất cốt lõi của câu hỏi của bạn:

self.showPerson = function (person, event) { 
    element = event.srcElement 
    ... 
} 
+0

Cảm ơn bạn đã trả lời, nhưng đó không phải là những gì tôi yêu cầu. 'showPerson()' nhận dữ liệu chính xác. Tôi hỏi nếu tôi có thể nhận được phần tử tương ứng từ cá thể Model được truyền vào 'showPerson()' – badsyntax

+0

event.srcElement chỉ hoạt động trong IE. – vijayst

0
self.showPerson = function(data, event) { 
    // event.currentTarget is the DOM element 
    // $(event.currentTarget) gives the jQuery element 
} 
+1

Tôi đã hỏi liệu tôi có thể lấy yếu tố từ mô hình, không phải từ các tham số xử lý sự kiện hay không. – badsyntax

15

Bạn chỉ có thể tạo ra một ràng buộc

// data-bind="element: observable" 
    // sets observable to element .. 
    ko.bindingHandlers.element = { 
     init: function(element, valueAccessor) { 
      var target = valueAccessor(); 
      target(element); 
     } 
    }; 

Trong mô hình quan điểm của bạn tùy chỉnh, tạo ra một 'trường' để lưu trữ các phần tử:

person.el = ko.observable(null); 

Sau đó, trong html mẫu của bạn ..

<div data-bind="element: el"> .... </div> 
+2

Điều này nên là câu trả lời, vì đó là giải pháp duy nhất trên trang cho phép tôi truy cập vào phần tử bị ràng buộc từ mô hình xem bên trong, chứ không phải khi được nhấp, nhưng ngay khi nó bị ràng buộc. –

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