apa arti dari '=?' dalam deklarasi lingkup isolate direktif angularJS?

127

Apakah tanda tanya setelah sama memiliki makna khusus? yaitu:

scope: {foo: '=?'}

apakah arti di atas berarti 'tidak menimbulkan kesalahan jika' foo 'tidak dapat diselesaikan?

Nikita
sumber

Jawaban:

154

Iya:

Cakupan 'isolate' mengambil hash objek yang mendefinisikan sekumpulan properti lingkup lokal yang diturunkan dari cakupan induk. Properti lokal ini berguna untuk menambahkan nilai untuk template. Definisi lokal adalah hash properti lingkup lokal ke sumbernya:

=atau =attr- mengatur ikatan dua arah antara properti lingkup lokal dan properti lingkup induk dari nama yang ditentukan melalui nilai attratribut. Jika tidak ada attrnama yang ditentukan maka nama atribut diasumsikan sama dengan nama lokal. Diberikan <widget my-attr="parentModel">dan definisi widget scope: { localModel:'=myAttr' }, maka properti lingkup widget localModelakan mencerminkan nilai parentModelpada lingkup induk. Setiap perubahan parentModelakan tercermin dalam localModeldan setiap perubahan localModelakan tercermin dalam parentModel. Jika properti lingkup induk tidak ada, itu akan melempar pengecualian NON_ASSIGNABLE_MODEL_EXPRESSION. Anda dapat menghindari perilaku ini menggunakan =?atau =?attruntuk menandai properti sebagai opsional.

Itu harus memicu kesalahan yang diharapkan pada setiap intisari yang mempengaruhi properti lingkup:

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]);
    }
}
Matt Zeunert
sumber
1
Masuk akal, tetapi mengapa tidak direktif melempar ini. properti lingkup parent tidak ada dan penetapan lingkup TIDAK menggunakan '=?'
Nikita
7
Tampaknya hanya melempar kesalahan ketika nilai ditetapkan, seperti di sini: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert
@cebor Saat ini ditautkan dalam jawabannya, tetapi di sini ada tautan yang lebih langsung: docs.angularjs.org/api/ng/service/…
Jason Axelson
3
Meskipun secara pribadi saya berharap itu didokumentasikan di bagian ruang lingkup secara langsung dan tidak dalam $ compile.
Jason Axelson
Terima kasih atas jawabannya, saya telah menggunakan sudut selama lebih dari setahun dan tidak pernah menemukan "=?" opsi pada arahan. Anda baru saja membuat hari saya ;-)
wilblack