วิธีการแบ่งปันสิ่งที่น่าพิศวง JS สิ่งที่น่าสังเกตระหว่างองค์ประกอบ UI


12

ฉันเข้าใจวิธีใช้imports: {}และexports: {}แบ่งปันคุณสมบัติของส่วนประกอบ UI เช่น:

defaults: {
    exports: {
        shouldShowMessage: '${$.component}'
    }
}

ซึ่งส่งคืนชื่อคอมโพเนนต์ในการเอ็กซ์พอร์ต

ป้อนคำอธิบายรูปภาพที่นี่

แต่เมื่อฉันพยายามส่งออกสิ่งที่น่าพิศวงที่สังเกตได้มันไม่ได้กำหนดไว้เสมอ:

defaults: {
    exports: {
        shouldShowMessage: '${$.shouldShowMessage}'
    }
}

...

setupKoBindings: function() {
    this.shouldShowMessage = ko.observable('Testing');
}

ป้อนคำอธิบายรูปภาพที่นี่

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

คำตอบ:


12

ค่าของการส่งออกวัตถุต้องมีมติให้ชื่อและคุณสมบัติของอินสแตนซ์ UIComponent ที่คั่นด้วย ':' checkout.cart.total:titleยกตัวอย่างเช่น
ชื่อเป้าหมายการส่งออกจะต้องมีส่วนประกอบ "namespace" UI

ในตัวอย่างของคุณคุณตั้งค่าเป็นสตริงซึ่งแก้ไขเป็นคุณสมบัติของ UiComponent ที่เป็นแหล่งส่งออก การส่งออกไม่ได้ถูกกำหนดเมื่อคุณตรวจสอบเพราะนั่นไม่ใช่เป้าหมายการส่งออกที่ถูกต้อง

นี่คือตัวอย่างที่ใช้งานได้:

defaults: {
    exportTarget: "foo.bar",
    exportTargetProperty: "showMessage",

    tracks: {
        shouldShowMessage: true
    },

    exports: {
        shouldShowMessage: '${$.exportTarget}:${$.exportTargetProperty}'
    }
}
...

ด้านบนจะคัดลอกค่าของshouldShowMessageคุณสมบัติลงในคุณสมบัติshowMessageของ UiComponent ที่มีชื่อเต็มfoo.barทุกครั้งที่มีการเปลี่ยนแปลงค่า
โปรดทราบว่าสิ่งนี้จะไม่ทำให้คุณสมบัติเป้าหมายเป็นที่สังเกตได้โดยอัตโนมัติเช่นกัน สิ่งนั้นจะต้องมีการประกาศอย่างชัดเจนหากการเปลี่ยนแปลงค่าควรทำให้ KO ไปสู่โหนด DOM ที่แสดงผลอีกครั้งที่เข้าถึงคุณสมบัตินั้น

โดยวิธีการที่เพิ่มshouldShowMessageไปยังtracksวัตถุที่จะทำให้มันเป็นเกาะ-ES5 ที่สังเกตได้โดยอัตโนมัติ การใช้ko.observable()งานวรรณกรรมก็เช่นกัน

ในตัวอย่างข้างต้นexportTargetและมีการกำหนดค่าในexportTargetProperty defaultsพวกเขายังสามารถระบุได้ว่าเป็นส่วนหนึ่งของตัวเลือก UiComponent ใน JSON ซึ่งมักจะสมเหตุสมผลมากกว่าเนื่องจากเป็นที่ลำดับชั้นของ UiComponent รวมถึงชื่อ UiComponent ที่กำหนดไว้

ในที่สุดฉันต้องการทราบว่าฉันคิดว่าโซลูชันของคุณโดยใช้วัตถุค่าเพื่อส่งผ่านค่าไปยังองค์ประกอบ UI อื่น ๆ นั้นดีกว่าการใช้การส่งออกหรือนำเข้า จากประสบการณ์ของฉันที่รักษาสถานะที่ใช้ร่วมกันใน DOM หรือ UiComponents เป็นสูตรสำหรับปาเก็ตตี้ OOP ในทุกกรณียกเว้นกรณีที่ง่ายที่สุด


คำอธิบายที่ยอดเยี่ยมขอบคุณ @Vinai! ฉันจะลองดูเมื่อฉันมีเวลาและทำเครื่องหมายว่าเป็นที่ยอมรับถ้าใช้งานได้
Ben Crook

ฉันพบปัญหาบางอย่างเมื่อใช้tracksงานการสมัครสมาชิก observables ไม่ทำงานอีกต่อไปthis.shouldShowMessage.subscribe is not a functionเมื่อใช้this.shouldShowMessage.subscribe(function() { ... }); มันใช้งานได้ดีเมื่อตั้งค่า observables ด้วยวิธีอื่น รู้สึกราวกับว่าฉันขาดขั้นตอนหรือtracksไม่สร้างสิ่งที่สังเกตได้ในลักษณะเดียวกัน
Ben Crook

คุณพูดถูกคุณสมบัติไม่ได้เป็นปกติอีกต่อไปเพียงแค่ ES5 getter / setter ถ้าคุณต้องการเข้าถึงฟังก์ชั่นดั้งเดิมที่สังเกตได้คุณสามารถฉีด ko และใช้ko.getObservable(this, 'shouldShowMessage').subscribe(function(newValue) { ...});(อาร์กิวเมนต์แรกคือ viewmodel ( this) ซึ่งเป็นชื่อที่สองของคุณสมบัติที่ติดตามข้อมูลเพิ่มเติมที่นี่: github.com/SteveSanderson/knockout-es5
Vinai

Ahh ที่เหมาะสมคุณเป็น <3
Ben Crook

1
หลังจากเล่นกับการนำเข้าและส่งออกแล้วและยังคงล้มเหลวฉันเห็นด้วยว่านี่คือรหัสสปาเก็ตตี้ฉันเลิกแล้ว
Ben Crook
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.