2012-02-23 25 views
7

Tôi có thẻ neo như thế nàyĐi qua các tham số để một hàm trong knockoutjs ViewModel

<a href="#" class="btn btn-success order-btn" data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier}, click: $root.setPath.bind($data,$data.tierName, $parent.identifier)">Send values</a> 

Trong viewmodel

var appViewModel = { 
    setPath: function (data, tier, identifier) { 
     alert(data); 
     alert(tier); 
     alert(identifier); 
    }, 
........... 
........... 
} 

Kết quả là một số knockoutjs mã lõi được hiển thị trong thông điệp cảnh báo (có thể định nghĩa về các hàm có thể quan sát(), dependObservable() và [Object object] rỗng khi được cảnh báo với JSON.stringify)

tại sao tính năng này hoạt động?

data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier} 

nhưng không này:

click: $root.setPath.bind($data,$data.tierName, $parent.identifier) 

lưu ý rằng tierName là một quan sát được(), nhận dạng được tính()

Tôi có thể tìm thêm về ràng buộc đâu() ??

Trả lời

6

Kể từ tierNameidentifier là quan sát, bạn cần phải gọi cho họ tiếp cận với các giá trị của họ:

click: $root.setPath.bind($data, $data.tierName(), $parent.identifier()) 

Ngoài ra, số đầu tiên trong bind() sẽ bị ràng buộc để this trong setPath, vì vậy tôi đoán bạn cần một cái gì đó như thế này:

click: $root.setPath.bind(/*will be bound to this*/ $root, $data, 
         $data.tierName(), $parent.identifier()) 

Cuối cùng, nếu $data chính nó là một quan sát được (mà không phải là rõ ràng nếu nó là từ bạn mã), sau đó bạn cần phải gọi nó là tốt:

click: $root.setPath.bind($root, $data(), $data().tierName(), $parent.identifier()) 

Cũng nhớ liên kết đã được giới thiệu trong ECMAScript 5, vì vậy nó có thể không có trong tất cả các trình duyệt. Vì vậy, tôi có lẽ sẽ làm một cái gì đó giống như thay vì điều này:

click: function(){$root.setPath($data, $data.tierName(), $parent.identifier());} 

Here là thông tin bổ sung về bind.

+0

tôi muốn thực hiện 'alert (tầng); alert (identifier); 'trong chức năng viewmodel của tôi, tôi đã không thực sự muốn bối cảnh (điều này). Vì vậy, chức năng của tôi đã trở thành 'setPath (tier, identifier)' Cảm ơn bạn đã giúp đỡ – nthapa13

+0

KO không thêm một thực hiện 'bind' nếu nó không có sẵn, vì vậy nếu bạn đang tham chiếu KO, thì bạn an toàn để sử dụng' bind'. –

+0

Cảm ơn bạn RP Niemeyer, nó là tốt để biết. –

6

Tham số đầu tiên là bind là đích (bạn muốn this) khi chức năng của bạn được thực hiện. Vì vậy, nếu bạn muốn data là đối số đầu tiên, thì nó cần phải là đối số thứ hai.

Bên trong chức năng của bạn, nếu bạn đang xử lý các quan sát hoặc có thể quan sát được, thì bạn cần phải tháo chúng ra để xem giá trị của chúng. Bạn sẽ làm điều này bằng cách gọi nó là một hàm alert(data()); hoặc bằng cách gọi alert(ko.utils.unwrapObservable(data)); (thường được sử dụng khi bạn không biết ở kiểu thiết kế nếu những gì bạn sắp xử lý là một quan sát hoặc không thể quan sát được)

Lý do mà attr và các ràng buộc khác hoạt động khi bạn vượt qua một quan sát/có thể quan sát được là tất cả chúng đều gọi ko.utils.unwrapObservable để thuận tiện cho bạn (vì vậy bạn không phải thêm () khi chuyển quan sát trừ khi bạn đang viết biểu thức !$data().

Dưới đây là một số tham chiếu về liên kết: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

+0

Cảm ơn bạn @RPN vì phản hồi, nó thực sự hữu ích. – nthapa13

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