2012-04-13 28 views
11

KnockoutJS có khái niệm về các quan sát được tính toán, là các hàm phụ thuộc vào một hoặc nhiều quan sát được. Knock-out có thể determine the dependencies of a computed observable as described in the docs:KnockoutJS - Các quan sát được tính toán với các câu lệnh điều kiện hoạt động như thế nào

Bất cứ khi nào bạn khai báo một thể quan sát được, KO ngay lập tức gọi chức năng đánh giá của nó được tính toán để có được giá trị ban đầu của nó. Trong khi chức năng đánh giá của bạn đang chạy, KO lưu giữ nhật ký của bất kỳ quan sát nào (hoặc tính quan sát được) mà người đánh giá của bạn đọc giá trị của.

Bây giờ, những gì tôi không hiểu là, cách thức hoạt động nếu quan sát được tính của bạn chứa logic có điều kiện. Nếu Knockout gọi hàm đánh giá, chắc chắn logic điều kiện có thể dẫn đến các quan sát mà hàm phụ thuộc vào việc không được gọi?

Tôi tạo ra fiddle này để kiểm tra:

http://jsfiddle.net/bJK98/

var ViewModel = function(first, last) { 
    this.firstName = ko.observable(first); 
    this.lastName = ko.observable(last); 
    this.condition = ko.observable(false); 

    // at the point of evaluation of this computed observabled, 'condition' 
    // will be false, yet the dependecy to both firstName and lastName is 
    // identified 
    this.fullName = ko.computed(function() { 
     return this.condition() ? this.firstName() : this.lastName(); 
    }, this); 
}; 

Tuy nhiên, bằng cách nào đó Knockout xác định một cách chính xác phụ thuộc vào cả hai firstNamelastName.

Bất cứ ai có thể giải thích cách thực hiện?

+0

Không thể nhận được câu hỏi, tôi tin rằng các quan sát được tính sẽ xác định trạng thái của riêng trong thời gian chạy bằng cách đánh giá tất cả các phụ thuộc, vì vậy tất cả trông rõ ràng và đơn giản, xin lỗi nhưng không thể có được điểm chính của câu hỏi của bạn – sll

+2

Câu hỏi hay.Tôi luôn nghĩ cách tiếp cận mà họ mô tả trong sách hướng dẫn như bạn đã trích dẫn khá thông minh, nhưng bây giờ bạn chỉ ra điều này, tôi tự hỏi liệu nó có thông minh và không chỉ khá thông minh ...: D –

Trả lời

12

các phụ thuộc được theo dõi một lần nữa mỗi khi một phụ thuộcKhông thể đánh giá được đánh giá lại. Vì vậy, nếu bạn có logic điều kiện, thì nhánh không bị nhấn sẽ không đóng góp vào các phụ thuộc.

Nếu bạn chỉnh sửa số firstName, thì giá trị sẽ không được cập nhật cho đến khi bạn chuyển đổi condition. Tại thời điểm đó, lastName không còn là phụ thuộc nữa, do đó, các thay đổi đối với nó không kích hoạt dependObservable.

Nó không thực sự phức tạp hơn mô tả ban đầu. Điều cơ bản cần nhớ là phụ thuộc được ghi lại mỗi khi nó được đánh giá lại.

0

Trong phụ thuộc loại trực tiếp được theo dõi thông qua biến theo dõi đơn lẻ ko.dependencyDetection.

  1. Vì vậy, bất cứ khi nào bạn khai báo biến tính toán Knockout ngay lập tức gọi hàm đánh giá của nó để nhận giá trị ban đầu và phụ thuộc của nó.
  2. Vì vậy, trong lần gọi đầu tiên, nó sẽ đăng ký phụ thuộc của nó trên các biến số lastNamecondition.
  3. Bây giờ bất cứ khi nào lastName thay đổi, nó sẽ cập nhật tất cả các giá trị phụ thuộc của nó.
  4. Và bất cứ khi nào condition thay đổi, nó sẽ chạy lại chức năng đánh giá của nó và cập nhật tất cả các phụ thuộc. Vì vậy, nó sẽ thêm firstName làm phụ thuộc và xóa lastName.

Vì vậy, đây là cách tính năng theo dõi phụ thuộc hoạt động trong loại trực tiếp.

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