2012-02-16 27 views
11

Với Knockout 2.0 sử dụng dữ liệu này ràng buộc:Knockout 2.0 tham số từ ràng buộc theo thứ tự không chính xác?

data-bind="click: $root.deleteSomeEntity.bind($data, $parent)" 

trong viewmodel Knockout JavaScript đối số đầu tiên trong

self.deleteSomeEntity = function (data, parent) { 
    // perform deletion 
} 

dường như là cha mẹ chứ không phải là dữ liệu.

Có lý do nào cho hành vi này hoặc điều gì đó tôi bị thiếu không?

Trả lời

12

Khi bạn gọi bind thông số đầu tiên sẽ là giá trị this. Vì vậy, trong cuộc gọi this của bạn sẽ là $data và đối số đầu tiên sẽ là $parent.

Nếu $root$parent trong trường hợp này, sau đó bạn chỉ có thể làm:

$root.deleteSomeEntity.bind($root)

KO sẽ vượt qua các dữ liệu như các tham số đầu tiên và this sẽ được thiết lập để $root.

Nếu $parent không phải là $root (và bạn có thể không muốn dựa vào this trở thành một đối tượng khác nhau mà $root trong phương pháp của bạn trên thư mục gốc), sau đó bạn sẽ làm điều gì đó như:

$root.deleteSomeEntity.bind($root, $data, $parent)

Nếu không, có những cách chắc chắn để đảm bảo rằng bạn có đúng this trong mô hình chế độ xem của mình. Nó phụ thuộc vào cấu trúc của bạn mặc dù.

+0

Tiếp theo đề xuất của bạn: http://jsfiddle.net/6MmWs/5/ tuy nhiên khi nhấn Delete và chức năng 'self.deleteContactPhone = (viewModel, phone, contact)' viewModel là điện thoại, điện thoại là một số liên lạc, và số liên lạc cũng là một điện thoại. 'this' hiện là viewmodel. – kendaleiv

+1

Bạn sẽ muốn nó giống như: http://jsfiddle.net/rniemeyer/6MmWs/6/. Một vài điều cần đề cập. 'remove' là một hàm có sẵn trên một ObservableArray. Tôi đã chuyển đổi các mảng 'điện thoại' của bạn thành có thể quan sát được, do đó bạn có' xóa' và cập nhật giao diện người dùng của bạn khi bị xóa. –

+0

Điều khác là muốn chữ ký hàm của bạn chỉ là 'hàm (điện thoại, liên hệ)'. Tham số đầu tiên cho 'bind' là target, được sử dụng để kiểm soát giá trị của' this' khi hàm của bạn chạy. Vì vậy, nó không thực sự là một đối số cho hàm. –

2

Tại sao bạn sử dụng bind()? Theo mặc định, nếu bạn chỉ cần viết tên của hàm javascript là sự kiện nhấp, Knockout sẽ vượt qua $data làm đối số đầu tiên và sự kiện là thứ hai.

http://knockoutjs.com/documentation/click-binding.html (Lưu ý 1 & 2)

Tại sao bận tâm với bind() khi bạn chỉ có thể làm điều này:

data-bind="click: function() {$root.deleteSomeEntity($data, $parent)}" 
+0

Mã đó dường như được thực thi mà không cần nhấp vào tôi. Nó nằm bên trong một data-bind = "foreach: ..." nếu điều đó thay đổi bất cứ điều gì. – kendaleiv

+0

Ồ, tất nhiên rồi! Xin lỗi về điều đó, tôi đã chỉnh sửa mã để một hàm '()' được bao bọc xung quanh liên kết nhấp chuột. Điều này sẽ làm việc như mong đợi bây giờ. – soniiic

+1

Nó chỉ là một điều phong cách. Nhiều người không thích đặt các chức năng ẩn danh trong đánh dấu của họ. Đây là một trong những điều khiến mọi người tắt khi họ bắt đầu ở KO, đặc biệt là khi họ quen với cách tiếp cận kín đáo hơn. Nó hoạt động tốt theo một trong hai cách, mặc dù tôi thích đảm bảo rằng 'this' được đặt một cách thích hợp trong chính mô hình khung nhìn. –

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