2011-09-26 29 views
5

Tôi đang sử dụng phiên bản mở rộng đặc biệt của Ko sử dụng chức năng loại commit()/peek() trên một người phụ thuộc để tôi chỉ lưu dữ liệu vào biểu mẫu nếu nó được cam kết với cơ sở dữ liệu (trên Ok) và được hoàn nguyên khi hủy.Tại sao hộp kiểm trong knockoutJs chỉ được ghi khi được chọn?

Vấn đề tôi gặp phải là khi tôi chọn hộp kiểm, chức năng ghi được gọi chính xác trên phạm vi được bảo vệ. Tuy nhiên, nếu tôi bỏ chọn hộp kiểm, chức năng ghi không được gọi, vì vậy khi mô hình được gửi tới bộ điều khiển MVC của tôi, hộp kiểm boolean vẫn là TRUE.

Tại sao loại trực tiếp không ghi giá trị FALSE?

CẬP NHẬT CÂU HỎI VỚI Mã sản phẩm:

Xin xem JsFiddle này ở đây để chứng minh: http://jsfiddle.net/b2Qu2/3/

vấn đề nhỏ

Lưu ý rằng có 1 vấn đề khác với bản demo - cho một số lý do, khi tôi kiểm tra/bỏ chọn hộp kiểm, giá trị được nhìn thấy không được cập nhật trên giao diện người dùng mặc dù nó được xích vào một người phụ thuộcKhả thể hỗ trợ. Bạn vẫn có thể nhìn thấy giá trị bằng cách nhấp vào nút 'peek'.

Issue Major

Để tái tạo vấn đề:

1) Click 'peek' button: Shows FALSE - CORRECT 

2) Check IsAdmin checkbox 

3) Click 'peek' again: Shows TRUE - CORRECT 

4) Uncheck IsAdmin 

5) Click 'peek' again: SHOWS TRUE - INCORRECT!! 

Ví dụ kịch bản

Hãy tưởng tượng một hộp thoại được hiển thị với một hộp kiểm cho người dùng Quản trị. Chỉ có thể đặt 1 người dùng quản trị và máy chủ trả lời hợp lệ/không hợp lệ nếu người dùng quản trị đã tồn tại. Người dùng sau đó bỏ chọn hộp kiểm, nhưng bây giờ viewmodel nghĩ rằng hộp kiểm là luôn luôn đúng ?? Lý do cho việc sử dụng protectedObservable là nếu đáp ứng của máy chủ thành công, phương thức commit() được gọi để mọi thứ được duy trì trên UI. Nếu người dùng hủy bỏ hộp thoại hoặc lỗi xảy ra, các giá trị ban đầu sẽ không bị ghi đè.

+0

Bạn có thể chia sẻ nhiều mã của mình hơn mức độ liên kết/được sử dụng không? –

+0

@RP Niemeyer - Tôi đã cập nhật câu hỏi của mình với một số mã. Đấu tranh với cái này !! – jaffa

Trả lời

3

Lý do rằng ghi chỉ kích hoạt trên một giá trị là bởi vì nó sẽ chỉ kích hoạt khi nó tin rằng nó cần phải viết một giá trị khác với những gì nó bị ràng buộc. Vì vậy, giá trị thực tế của protectedObservable của bạn không thay đổi. Nếu nó là đúng và bạn cố gắng đặt nó thành true, thì ghi không cháy, vì nó tin rằng nó có giá trị đúng.

tôi có lẽ sẽ thay đổi nó lên một chút và sử dụng một cái gì đó như thế này:

ko.protectedObservable = function (initialValue) { 
    //private variables 
    var _actual = ko.observable(initialValue), 
     _temp = ko.observable(initialValue); 

    //access to temp value 
    _actual.temp = _temp; 

    //commit the temporary value to our observable, if it is different 
    _actual.commit = function() {   
     if (_temp() !== _actual()) { 
      _actual(_temp()); 
     } 
    }; 

    //notify subscribers to update their value with the original 
    _actual.reset = function() { 
     _actual.valueHasMutated(); 
     _temp(_actual()); 
    }; 

    return _actual; 
}; 

Với phiên bản này bạn có thể liên kết chống lại field1 hoặc field1.temp. Bạn thậm chí không cần xem trước, vì cả giá trị tạm thời và giá trị thực đều có thể quan sát được.

Nó sẽ trông giống như sau: http://jsfiddle.net/rniemeyer/BwDYE/

+0

Xin chào, cảm ơn ví dụ về mã.Toàn bộ mã cơ sở của tôi dựa trên protectedObservable dựa trên fiddle đầu tiên của tôi vì vậy không chắc chắn tôi muốn thay đổi hành vi/ràng buộc của nó. Các ràng buộc trên mô hình sử dụng các đối tượng protectedObservables thực tế thay vì .temps. Ví dụ của bạn dựa trên một thiết lập lại() nếu hộp thoại bị hủy bỏ/lỗi máy chủ và commit() thành công. Mô hình của tôi dựa trên nghịch đảo, nếu người dùng hủy bỏ, hoặc lỗi máy chủ sau đó không làm gì khi các giá trị được nhìn thấy được sử dụng để gửi đến máy chủ. Nếu máy chủ thành công, sau đó commit(). Mmm, không chắc chắn làm thế nào để có được vòng này ... – jaffa

+1

Tôi không chắc chắn tôi hoàn toàn theo cách nó là khác nhau. Chỉ cần liên kết mọi thứ với 'yourfield.temp' thay vì' yourfield'. Nên làm việc như vậy. Có lẽ bạn có thể giúp tôi hiểu rõ hơn cách nó không hoạt động trong kịch bản của bạn? Sẽ vui lòng giúp đưa ra giải pháp thay thế phù hợp. –

+1

Có cách nào để đảm bảo rằng hộp kiểm depedentObservable giá trị luôn luôn được viết để bất kể cho dù nó đã thay đổi từ giá trị ban đầu của nó. Có vẻ như đây là vấn đề và quan hệ với câu trả lời ban đầu của bạn. Tôi đặt các câu lệnh debug trong hàm write trên mã ban đầu của tôi, và nó chỉ được gọi khi giá trị hộp kiểm ngược lại với giá trị ban đầu của nó không tốt, vì giá trị được nhìn thấy sẽ không được cập nhật. Nếu điều này có thể được sửa, tôi sẽ không cần phải thay thế tất cả các chế độ xem của tôi bằng .temps. Hy vọng điều này có ý nghĩa! Hãy cho tôi biết những gì bạn nghĩ là cách tốt nhất để chuyển tiếp. – jaffa

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