2012-04-10 24 views
6

Trong chế độ xem Knockout của tôi, tôi đã có một số thuộc tính mà tôi đang cố gắng làm cho hàm băm có thể quan sát được. Vì vậy, thay vì trước Knockout mã của tôi củaLàm thế nào để bạn quan sát các hashtables JavaScript trong Knockout?

self.MyHash = {}; 

Tôi hiện đang sử dụng:

self.MyHash = ko.observable({}); 

Trong các phần khác của mã của tôi, tôi đang thao tác băm với tuyên bố như thế này:

// add an entry 
self.MyHash()["test"] = "My Value"; 

// remove an entry 
delete self.MyHash()["test"]; 

Mã hoạt động, trong đó các mục được thêm vào và xóa đúng cách. Tuy nhiên, những thay đổi đối với hashtable dường như không được phát hiện bởi các khu vực của mã đang quan sát nó. Ví dụ, điều này tính quan sát được không bao giờ chạy khi tôi thay đổi Hashtable:

self.Querystring = ko.computed(function() 
{ 
    var f = []; 
    $.each(self.MyHash(), function (k, v) 
    { 
     f.push(encodeURIComponent(k) + '=' + encodeURIComponent(v)); 
    }); 

    return (f.length > 0) ? f.join("&") : ""; 
}); 

Tôi sẽ đoán rằng điều này là do quan sát Knockout bắt buộc phải được biến đơn giản (hoặc observableArrays), và rằng nó không phát hiện những thay đổi cơ bản đối với hashtable của tôi.

Nếu có, có các tùy chọn khác không? Tại sao không có loại ObsableHash trong Knockout?

Đối với những gì đáng giá, giải pháp thay thế của tôi là có một khóa quan sát được và một JavaScript thông thường có thể bắt đầu để tra cứu các giá trị. Sau đó, tôi đã thay đổi phương pháp tính toán của mình để quan sát mảng các khóa thay vì biến hashtable khác mà tôi đã có trước đây. Tôi chỉ muốn chắc chắn rằng tôi không bỏ lỡ "The Right Way" để làm điều đó trong Knockout.

self.MyHashKeys = ko.observableArray(); 
self.MyHash = {}; 

self.Querystring = ko.computed(function() 
{ 
    var f = []; 
    $.each(self.MyHashKeys(), function (index, value) 
    { 
     f.push(encodeURIComponent(value) + '=' + encodeURIComponent(self.MyHash[value])); 
    }); 

    return (f.length > 0) ? f.join("&") : ""; 
}); 

Trả lời

7

Xem ví dụ thứ hai trên observable array page. Chỉ cần thực hiện một loạt các cặp/giá trị chính:

// This observable array initially contains three objects 
var anotherObservableArray = ko.observableArray([ 
    { name: "Bungle", type: "Bear" }, 
    { name: "George", type: "Hippo" }, 
    { name: "Zippy", type: "Unknown" } 
]); 

Trong ví dụ của bạn, bạn chỉ được lặp lại (trừ để xóa), vì vậy không có nhu cầu thực sự sử dụng một từ điển thực tế. Nó sẽ được dễ dàng, đủ để chỉ cần tìm kiếm chìa khóa. Tôi nghĩ việc sử dụng bản đồ là một loại tối ưu hóa sớm ở một mức độ nào đó. Nó cũng không hoàn toàn phù hợp với khả năng của chuỗi truy vấn để hỗ trợ cùng một khóa nhiều lần.

Edit: nếu bạn muốn quan sát các khóa hoặc giá trị thay đổi trong ví dụ này, bạn cũng sẽ phải làm cho những thuộc tính quan sát được:

var anotherObservableArray = ko.observableArray([ 
    { name: ko.observable("Bungle"), type: ko.observable("Bear") } 
]); 
+3

Có cách nào để quan sát một Hashtable? Tôi muốn có thể thực hiện tra cứu chính – mcintyre321

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