ý nghĩa của '=?' trong angularJS chỉ thị cách ly khai báo phạm vi?


127

Liệu dấu hỏi sau bằng có ý nghĩa đặc biệt? I E:

scope: {foo: '=?'}

điều này có nghĩa là 'không gây ra lỗi nếu' foo 'không thể được giải quyết?

Câu trả lời:


154

Đúng:

Phạm vi 'cô lập' lấy hàm băm đối tượng xác định một tập các thuộc tính phạm vi cục bộ xuất phát từ phạm vi cha. Các thuộc tính cục bộ này rất hữu ích cho các giá trị răng cưa cho các mẫu. Định nghĩa địa phương là một hàm băm của thuộc tính phạm vi cục bộ đối với nguồn của nó:

=hoặc =attr- thiết lập liên kết hai chiều giữa thuộc tính phạm vi cục bộ và thuộc tính phạm vi cha của tên được xác định thông qua giá trị của attrthuộc tính. Nếu không có attrtên nào được chỉ định thì tên thuộc tính được coi là giống với tên cục bộ. Do <widget my-attr="parentModel">và định nghĩa phụ tùng của scope: { localModel:'=myAttr' }, sau đó sở hữu phạm vi phụ tùng localModelsẽ phản ánh giá trị parentModeltrên phạm vi phụ huynh. Mọi thay đổi parentModelsẽ được phản ánh localModelvà mọi thay đổi trong localModelsẽ phản ánh parentModel. Nếu thuộc tính phạm vi cha không tồn tại, nó sẽ ném ngoại lệ NON_ASSIGNABLE_MODEL_EXPRESSION. Bạn có thể tránh hành vi này bằng cách sử dụng =?hoặc =?attrđể gắn cờ tài sản là tùy chọn.

Nó sẽ kích hoạt lỗi dự kiến ​​trên mỗi thông báo ảnh hưởng đến thuộc tính phạm vi:

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
Có ý nghĩa nhưng tại sao không ném ngoại lệ chỉ thị này . thuộc tính phạm vi cha không tồn tại và gán phạm vi KHÔNG sử dụng '=?'
Nikita

7
Nó dường như chỉ đưa ra lỗi khi giá trị được đặt, như ở đây: plnkr.co/edit/OSpaC6sPE0hY9yAeFghr?p=preview
Matt Zeunert

@cebor Hiện tại nó được liên kết trong câu trả lời, nhưng đây là một liên kết trực tiếp hơn: docs.angularjs.org/api/ng/service/ Kẻ
Jason Axelson

3
Mặc dù cá nhân tôi muốn nó được ghi lại trong phần phạm vi trực tiếp và không phải trong $ compile.
Jason Axelson

Cảm ơn câu trả lời, tôi đã sử dụng angular trong hơn một năm và không bao giờ tìm thấy "=?" tùy chọn trên một chỉ thị. Bạn vừa làm cho ngày của tôi ;-)
wilblack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.