Bên trong biểu thức ràng buộc knockout.js, tôi có thể sử dụng $data
, $parent
, and $root
pseudovariables. Làm thế nào tôi có thể nhận được tương đương với những pseudovariables khi tôi đang sử dụng một số ko.computed
observable được khai báo trong JavaScript?
Tôi có chế độ xem mô hình gốc với bộ sưu tập trẻ em và mô hình chế độ xem chính có số selectedChild
có thể quan sát được. Cho rằng, tôi có thể sử dụng biểu thức liên kết dữ liệu để thêm một lớp CSS để bất cứ đứa trẻ hiện đang được chọn: "Tôi chọn"
<ul data-bind="foreach: children">
<li data-bind="text: name,
css: {selected: $data === $root.selectedChild()},
click: $root.selectChild"></li>
</ul>
<script>
vm = {
selectedChild: ko.observable(),
children: [{name: 'Bob'}, {name: 'Ned'}],
selectChild: function(child) { vm.selectedChild(child); }
};
ko.applyBindings(vm);
</script>
Nhưng viewmodels tôi sẽ nhận được phức tạp hơn, và tôi muốn để có thể làm nhiều hơn là chỉ thêm một lớp CSS vào một phần tử duy nhất. Tôi thực sự muốn tạo một thuộc tính được tính trên isSelected
trên mô hình xem con, vì vậy tôi có thể thêm các thuộc tính được tính toán khác phụ thuộc vào nó.
Tôi đã cố gắng chỉ viết JavaScript mà đề cập đến $data
và $root
, trên off-cơ hội loại trực tiếp mà có thể xác định các biến và bằng cách nào đó có chúng được trong phạm vi khi nó gọi chức năng computed
đánh giá của tôi:
{
name: 'Bob',
isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}
Nhưng không có may mắn như vậy: bên trong bộ đánh giá của tôi function
, cả hai $data
và $root
là undefined
.
Tôi cũng đã thử sử dụng ko.contextFor
bên trong bộ đánh giá vì nó cung cấp quyền truy cập vào $data
và $root
. Thật không may, bên trong chức năng đánh giá của tôi, contextFor
cũng luôn trả về undefined
. (Tôi đã không giữ hy vọng cao cho chiến lược này anyway - nó không rõ ràng như thế nào knockout sẽ có thể theo dõi các phụ thuộc nếu tôi đã phải đi sau lưng của nó như thế này.)
Tôi luôn có thể tự thiết lập một thuộc tính trên mỗi viewmodel con tham chiếu trở lại viewmodel cha. Nhưng tôi biết rằng loại trực tiếp đó có khả năng làm điều này cho tôi, và tôi muốn ít nhất là khám phá xem liệu tôi có thể sử dụng các cơ chế của nó trước khi tôi tự viết hay không.
Nó có vẻ như nó nên có thể dịch biểu thức ràng buộc ở trên để một quan sát tính - sau khi tất cả, that's what knockout already does:
Bí quyết gọn gàng khác là ràng buộc khai báo được thực hiện đơn giản là quan sát tính toán.
Nhưng làm cách nào để xử lý các biến giả $data
và $root
khi tôi đang viết quan sát được tính của riêng mình?
cảm ơn bạn vì ví dụ thứ hai của bạn! – vittore
làm thế nào bạn sẽ gọi một hàm trên root cũng như nhấp chuột: $ root.selectedItem, trong cùng một ràng buộc? – FutuToad
ví dụ, điều này không hoạt động: click: function() {$ parent.openAlertDialogueEdit ($ data)} // $ data có vẻ là một bản sao, chứ không phải tham chiếu thực tế – FutuToad