2012-03-08 32 views
84

Tôi đang sử dụng phiên bản 2.0.0 KnockoutJSXác định nếu một tài sản đối tượng là ko.observable

Nếu tôi lặp qua tất cả các thuộc tính của một đối tượng, làm sao tôi có thể kiểm tra xem mỗi tài sản là một ko.observable? Dưới đây là những gì tôi đã thử cho đến thời điểm này:

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 sai.

Trả lời

138

Loại bỏ bao gồm chức năng được gọi là ko.isObservable(). Bạn có thể gọi nó là ko.isObservable(vm[key]).

Update từ bình luận:

Đây là một chức năng để xác định xem một cái gì đó là một tính quan sát được:

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 
}; 

UPDATE: Nếu bạn đang sử dụng KO 2.1 + - sau đó bạn có thể sử dụng ko.isComputed trực tiếp.

+2

Cảm ơn bạn. Bạn có cơ hội biết làm thế nào để cho biết nếu một quan sát được tính toán? Tôi có thể xác định nếu một quan sát là một mảng quan sát thông qua '$ .isArray (vm [key]())', nhưng bạn có biết làm thế nào để phân biệt các quan sát từ một 'ko.computed' ?? –

+7

KO 2.1 sẽ xuất hiện trong vài tuần tới sẽ bao gồm chức năng 'ko.isComputed'. Mã sẽ tương đương với những gì tôi đã thêm vào câu trả lời ở trên. –

21

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

ko.isObservable(vm[key]) 
-1

Tôi đang sử dụng

ko.utils.unwrapObservable(vm.key) 

Cập nhật: Tính đến phiên bản 2.3.0, ko.unwrap là được thêm làm thay thế cho ko.utils.unwrapObservable

+2

Đó là một unwraps một quan sát. Nó không kiểm tra xem một tài sản là một quan sát. –

+1

Bạn nói đú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ế;) –

+0

Nó cung cấp một cách hợp lệ để truy cập vào một tài sản có thể hoặc không thể quan sát được, tuy nhiên nó không trả lời câu hỏi này. – Ozil

1

Để tiếp tục trả lời câu trả lời của RP Niemeyer, nếu bạn chỉ muốn xác định e nếu một cái gì đó là "có thể đăng ký" (thường là trường hợp). Sau đó, ko.isSubscribable cũng có sẵn.

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