2013-10-21 13 views
5

Tôi hiện có hai chức năng mở rộng Knockout. Người ta thêm một thành viên vào Observable trong khi người kia chặn các hoạt động đọc và ghi.Mẫu tốt để giữ gìn các thuộc tính tùy chỉnh được tạo trong tiện ích mở rộng Knockout?

Khi kết hợp các phương pháp mở rộng, thứ tự ứng dụng có tác dụng không mong muốn.

Ví dụ mã đơn giản bên dưới.

ko.extenders.format = function(target) { 
    var result = ko.computed(function(){ 
     return "$" + target(); 
    }); 

    target.formatted = result; 

    return target; 
}; 

ko.extenders.numeric = function(target, precision) { 
    var result = ko.computed({ 
     read: function() { 
      var current = parseFloat(target()); 
      return current.toFixed(precision); 
     }, 
     write: function(newValue) { 
      newValue = parseFloat(newValue); 
      target(newValue.toFixed(precision)); 
     } 
    }); 

    return result; 
}; 

Trong phương pháp số, tôi có thể kiểm tra thành viên được định dạng và gán nó cho tính toán mới nhưng tôi không muốn cho kiến ​​thức về phương pháp khác. Điều này cũng sẽ không thể duy trì nếu tôi quyết định thêm các thành viên khác ngoài quan sát hoặc tiện ích mở rộng.

if(target.hasOwnProperty("formatted")){ 
    result.formatted = target.formatted; 
} 

Không có sửa lỗi hasOwnProperty. http://jsfiddle.net/gs5JM/2/

Lưu ý rằng MyValue4 - Định dạng: trống do thứ tự của ứng dụng mở rộng và mất thành viên được định dạng.

Có mô hình nào tốt hơn để đạt được cùng kết quả cuối cùng và làm cho mã linh hoạt hơn không?

Trả lời

1

Vấn đề là bộ mở rộng format của bạn đề cập đến nguyên bản có thể quan sát được và numeric tạo một cái mới. Vì vậy, formatnumeric hoạt động với các quan sát hoàn toàn khác nhau. Có vẻ như bạn nên xem xét trả lại ban đầu có thể quan sát được trong cả hai trường hợp.

tôi sẽ viết lại numeric bạn theo cách này:

ko.extenders.numeric = function(target, precision) { 

    ko.computed(function(){ 
     var current = parseFloat(target()); 
     target(isNaN(current) ? 0 : current.toFixed(precision)); 
    }); 

    return target; 
}; 

Anonymous computed sẽ tạo ra một thuê bao target thay đổi giá trị với đánh giá ngay lập tức. Hàm đánh giá sẽ cố gắng phân tích một giá trị và gán lại giá trị số được đặt trước cho mục tiêu quan sát được.

http://jsfiddle.net/gs5JM/3/

Lưu ý: You should not care about possible circular dependency because KO will not re-evaluate computed while it's already evaluating.

+0

Cảm ơn bạn đã trả lời. Tôi đã không biết rằng một ko.computed vô danh sẽ làm việc theo cách đó, nhưng nó có ý nghĩa. –

+0

Điều này làm việc tuyệt vời cho các quan sát và các trường được tính toán bằng một phương thức ghi, nhưng không thành công khi nó được tính toán chỉ với một phương thức đọc. Trong bộ mở rộng số ban đầu, tôi đã bao gồm cả chức năng đọc và ghi để tôi có thể sử dụng nó trong cả hai kịch bản. Bạn có gợi ý nếu nó không thể ghi được không? –

+0

Nó sẽ là kịch bản rất lạ khi bạn cần một extender để viết vào các quan sát chỉ đọc. Bạn có thể giải thích chi tiết? –

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