ความหมายของ '=?' ใน angularJS directive แยกการประกาศขอบเขต?


127

เครื่องหมายคำถามหลังเท่ากับมีความหมายพิเศษหรือไม่? เช่น:

scope: {foo: '=?'}

ข้างต้นหมายความว่า 'ไม่เพิ่มข้อผิดพลาดถ้า' foo 'ไม่สามารถแก้ไขได้?

คำตอบ:


155

ใช่:

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

=หรือ=attr- ตั้งค่าการผูกแบบสองทิศทางระหว่างคุณสมบัติขอบเขตโลคัลและคุณสมบัติขอบเขตหลักของชื่อที่กำหนดผ่านค่าของattrแอตทริบิวต์ หากไม่มีการattrระบุชื่อชื่อแอ็ตทริบิวต์จะถือว่าเหมือนกับชื่อโลคัล กำหนด<widget my-attr="parentModel">และกำหนด วิดเจ็ตของscope: { localModel:'=myAttr' }คุณสมบัติขอบเขตวิดเจ็ตlocalModelจะสะท้อนถึงค่าของparentModelขอบเขตพาเรนต์ การเปลี่ยนแปลงใด ๆ parentModelจะปรากฏในlocalModelและการเปลี่ยนแปลงใด ๆ ใน จะสะท้อนให้เห็นในlocalModel หากไม่มีคุณสมบัติขอบเขตหลักมันจะทำให้เกิดข้อยกเว้น NON_ASSIGNABLE_MODEL_EXPRESSION คุณสามารถหลีกเลี่ยงพฤติกรรมนี้ได้โดยใช้หรือเพื่อตั้งค่าสถานะคุณสมบัติเป็นทางเลือกparentModel=?=?attr

ควรทริกเกอร์ข้อผิดพลาดที่คาดไว้ในไดเจสต์ทุกรายการที่มีผลต่อคุณสมบัติขอบเขต:

parentSet = parentGet.assign || function() {
// reset the change, or we will throw this exception on every $digest
lastValue = scope[scopeName] = parentGet(parentScope);
     throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] +
     ' (directive: ' + newScopeDirective.name + ')');
};

//...


if (parentValue !== scope[scopeName]) {
    // we are out of sync and need to copy
    if (parentValue !== lastValue) {
        // parent changed and it has precedence
        lastValue = scope[scopeName] = parentValue;
    } else {
        // if the parent can be assigned then do so
        parentSet(parentScope, lastValue = scope[scopeName]);
    }
}

1
มีเหตุผล แต่ทำไมไม่มีข้อยกเว้นการโยนคำสั่งนี้ ไม่มีคุณสมบัติขอบเขตหลักและการกำหนดขอบเขตไม่ได้ใช้เครื่องหมาย '=?'
Nikita

7
ดูเหมือนว่าจะโยนข้อผิดพลาดเมื่อตั้งค่าเท่านั้นเช่นที่นี่: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert

@cebor ตอนนี้ลิงก์อยู่ในคำตอบ แต่นี่คือลิงก์โดยตรงเพิ่มเติม: docs.angularjs.org/api/ng/service/…
Jason Axelson

3
แม้ว่าโดยส่วนตัวแล้วฉันหวังว่ามันจะถูกบันทึกไว้ในส่วนขอบเขตโดยตรงและไม่ได้อยู่ใน $ compile
Jason Axelson

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