Xác định xem một thuộc tính đối tượng là ko.observable


98

Tôi đang sử dụng KnockoutJS phiên bản 2.0.0

Nếu tôi đang lặp qua tất cả các thuộc tính của một đối tượng, làm cách nào để kiểm tra xem mỗi thuộc tính có phải là một ko.observablekhông? Đây là những gì tôi đã thử cho đến nay:

    var vm = {
        prop: ko.observable(''),
        arr: ko.observableArray([]),
        func: ko.computed(function(){
            return this.prop + " computed";
        }, vm)
    };

    for (var key in vm) {
        console.log(key, 
            vm[key].constructor === ko.observable, 
            vm[key] instanceof ko.observable);
    }

Nhưng cho đến nay mọi thứ đều là giả dối.

Câu trả lời:


157

Knockout bao gồm một chức năng được gọi ko.isObservable(). Bạn có thể gọi nó như thế nào ko.isObservable(vm[key]).

Cập nhật từ bình luận:

Đây là một hàm để xác định xem một cái gì đó có phải là một thứ có thể quan sát được bằng máy tính hay không:

ko.isComputed = function (instance) {
    if ((instance === null) || (instance === undefined) || (instance.__ko_proto__ === undefined)) return false;
    if (instance.__ko_proto__ === ko.dependentObservable) return true;
    return ko.isComputed(instance.__ko_proto__); // Walk the prototype chain
};

CẬP NHẬT: Nếu bạn đang sử dụng KO 2.1+ - thì bạn có thể sử dụng ko.isComputedtrực tiếp.


2
Cảm ơn bạn. Bạn có tình cờ biết làm thế nào để biết liệu một vật có thể quan sát được không? Tôi có thể xác định xem một mảng có thể quan sát được là một mảng có thể quan sát được thông qua $.isArray(vm[key]()), nhưng bạn có biết cách phân biệt các mảng có thể quan sát được không ko.computed??
Adam Rackis

7
KO 2.1 sẽ ra mắt trong vài tuần tới sẽ bao gồm một ko.isComputedchức năng. Mã sẽ tương đương với những gì tôi đã thêm vào câu trả lời ở trên.
RP Niemeyer

27

Knockout có chức năng sau mà tôi nghĩ là những gì bạn đang tìm kiếm:

ko.isObservable(vm[key])

3

Để giải quyết câu trả lời của RP Niemeyer, nếu bạn chỉ đơn giản là muốn xác định xem thứ gì đó có thể "đăng ký được" hay không (trường hợp này thường xảy ra nhất). Sau đó, ko.isSubscribablecũng có sẵn.


0

Tôi đang sử dụng

ko.utils.unwrapObservable(vm.key)

Cập nhật : Kể từ phiên bản 2.3.0, ko.unwrapđã được thêm vào để thay thế choko.utils.unwrapObservable


2
Điều đó mở ra một quan sát được. Nó không kiểm tra xem một thuộc tính có phải là một thuộc tính có thể quan sát được hay không.
Adam Rackis

1
Bạn đúng. Nhưng thông thường nếu bạn cần biết để có được giá trị quan sát thực tế;)
Ivan Rodriguez

1
Nó cung cấp một cách hợp lệ để truy cập một thuộc tính có thể quan sát được hoặc không, tuy nhiên nó không trả lời được câu hỏi.
Ozil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.