วิธีการบังคับให้รีเฟรชมุมมองโดยไม่ให้ทริกเกอร์โดยอัตโนมัติจากสิ่งที่สังเกตได้?


151

หมายเหตุ:ส่วนใหญ่ใช้สำหรับการดีบักและทำความเข้าใจ KnockoutJS

มีวิธีการขอให้สิ่งที่น่าพิศวงอย่างชัดเจนเพื่อรีเฟรชมุมมองจากรูปแบบมุมมอง (ผูกไว้แล้ว)? ฉันกำลังมองหาบางสิ่งที่ชอบ:

ko.refreshView();

ฉันเข้าใจว่านี่ไม่ใช่การใช้สิ่งที่น่าพิศวง แต่ฉันยังต้องการทราบว่ามีวิธีการดังกล่าวสำหรับการแก้ไขจุดบกพร่องและการเรียนรู้หรือไม่

คำตอบ:


252

คุณไม่สามารถโทรหาบางอย่างใน viewModel ทั้งหมดได้ แต่ในแต่ละบุคคลที่สามารถสังเกตเห็นได้คุณสามารถโทรmyObservable.valueHasMutated()เพื่อแจ้งให้สมาชิกทราบว่าพวกเขาควรประเมินใหม่ โดยทั่วไปไม่จำเป็นต้องมีใน KO ดังที่คุณกล่าวไว้


5
คุณยังสามารถวนซ้ำในบริบทของข้อมูลค้นหาองค์ประกอบที่มีvalueHasMutatedคุณสมบัติที่เป็นประเภทfunctionและเรียกมันสำหรับแต่ละองค์ประกอบ สิ่งนี้ควรทำให้สิ่งที่คุณสังเกตเห็นได้ทั้งหมด แต่มันเป็นการฝึกฝนที่ไม่ดีและทำให้การอัปเดตเป็นไปได้มากกว่าที่คุณคาดไว้
Patrick M

มันจะดีถ้าไม่มีอะไร - ทดสอบด้วยโครเมียม
Scott Romack

viewModel ของคุณสามารถเป็นตัวติดตามได้ดังนั้นคุณสามารถโทรmyViewModel.valueHasMutated()เพื่ออัปเดตมุมมองทั้งหมดได้
Roy J

2
ไม่สามารถใช้งานอาร์เรย์ได้ที่นี่เช่นกัน ในความเป็นจริงอาร์เรย์ดูเหมือนจะไม่ทำงานในสิ่งที่น่าพิศวง ฉันคิดถึง Angular :-(
garryp

2
มันไม่ทำงานใน KnockoutObservableArrays ณ KO 3.5
Balint

25

ในบางสถานการณ์อาจมีประโยชน์เพียงแค่ลบการผูกแล้วนำมาใช้ใหม่:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))

ขอบคุณสำหรับการแก้ไข ebram ... เดาสิฉันควรจะพูดถึงว่าฉันใช้ coffeescript ;-)
ProfNimrod

15
ระวังถ้าคุณใช้ jQuery (เช่นเมื่อย้ายบิตของแอปไปยัง ko) เนื่องจาก cleanNode จะลบเหตุการณ์ dom อื่น ๆ ด้วย
Dan Revell

มันสมบูรณ์แบบ ฉันไม่สามารถรับ KO ให้รู้จักเด็กโดมใหม่ที่มีคุณลักษณะ data-bind หลังจากใช้โมเดลวิวเวอร์แล้ว
Andrew T Finnell

ที่สมบูรณ์แบบ! ทำงาน!
jeff_drumgod

0

ฉันได้สร้าง JSFiddle ด้วยตัวจัดการ bindHTML ที่น่าพิศวงของฉันที่นี่: https://jsfiddle.net/glaivier/9859uq8t/

ก่อนอื่นให้บันทึกตัวจัดการการผูกไว้ในไฟล์ของตัวเอง (หรือร่วมกัน) และรวมหลังจากการทำให้ล้มลง

หากคุณใช้สวิตช์นี้การเชื่อมของคุณเป็นแบบนี้:

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.