2012-07-17 36 views
52

Khi sử dụng loại trực tiếp, lợi thế của việc sử dụng các quan sát được tính chỉ đọc thay vì các hàm đơn giản là gì?Loại bỏ: chức năng quan sát được so với chức năng

Hãy viewmodel constructor và html đoạn sau, ví dụ:

var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = function(){ 
     return self.someProperty() + self.anotherProperty(); 
    };  
}; 

<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty()"></p> 

Mọi thứ ở đây dường như làm việc như bạn mong muốn, như vậy là có một lý do tại sao tôi thay vì nên sử dụng:

​var ViewModel = function(){ 
    var self = this; 
    self.someProperty = ko.observable("abc"); 
    self.anotherProperty = ko.observable("xyz"); 
    self.someComputedProperty = ko.computed(function(){ 
     return self.someProperty() + self.anotherProperty(); 
    });  
}; 


<input data-bind="value: someProperty"/> 
<input data-bind="value: anotherProperty"/> 
<p data-bind="text: someComputedProperty"></p> 

Tôi nhận thấy rằng tài liệu tại http://knockoutjs.com/documentation/computedObservables.html nói rằng "... các ràng buộc khai báo được thực hiện đơn giản như các quan sát được tính toán", vậy điều đó có nghĩa là tôi cần sử dụng chúng một cách rõ ràng trong các kiểu xem của tôi không?

Trả lời

71

Nếu mục đích duy nhất của quan sát được tính của bạn là thực hiện một ràng buộc đơn giản với nó, thì việc sử dụng hàm sẽ là tương đương. Bindings được thực hiện bên trong của một tính toán quan sát để theo dõi các phụ thuộc, do đó, nó sẽ kích hoạt lại ràng buộc của bạn khi bất kỳ của các quan sát thay đổi.

Dưới đây là một vài điều cần lưu ý về quan sát tính so với một hàm

  • giá trị của một tính quan sát được lưu trữ, vì vậy nó chỉ được cập nhật khi nó được tạo ra và khi một phụ thuộc được cập nhật. Đối với một chức năng thường xuyên, bạn sẽ cần phải thực hiện logic mỗi lần. Nếu nhiều thứ phụ thuộc vào giá trị đó (nói mỗi mục trong một bộ sưu tập là ràng buộc với một giá trị từ cha mẹ), thì logic này sẽ được chạy lặp đi lặp lại.

  • trong JavaScript của bạn, bạn cũng được tự do sử dụng các quan sát được tính như bạn sẽ quan sát khác. Điều này có nghĩa là bạn có thể tạo các đăng ký thủ công dựa vào chúng và phụ thuộc vào chúng từ các tính toán khác (gọi một hàm cũng sẽ tạo ra sự phụ thuộc này). Bạn có thể dựa vào các phương thức tiện ích thông thường trong KO như ko.utils.unwrapObservable để xác định chung nếu bạn cần gọi nó như là một hàm hay không để lấy giá trị.

  • nếu cuối cùng bạn muốn chuyển giá trị đến máy chủ, một giá trị được tính toán sẽ tự nhiên xuất hiện trong đầu ra JSON của bạn, trong khi giá trị là kết quả của hàm bình thường sẽ biến mất khi được chuyển đổi sang JSON (bạn sẽ có để làm nhiều việc hơn để điền một thuộc tính từ hàm đó trước).

+0

Câu trả lời hay: cảm ơn! – Duncan

+1

Câu trả lời hay. Đôi khi tôi sử dụng một hàm thay vì tính toán khi tôi MUỐN toàn bộ logic được thực thi mỗi lần. –

+1

Làm thế nào để nó biết rằng một quan sát tính toán phụ thuộc vào một quan sát khác, khi tất cả tôi thông qua nó là một chức năng? nó phân tích hàm đó! - thời gian để đọc mã nguồn knockout tôi đoán – zod

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