Làm cách nào để chuyển nhiều thuộc tính vào chỉ thị thuộc tính Angular.js?


116

Tôi có một chỉ thị thuộc tính bị hạn chế như sau:

 restrict: "A"

Tôi cần phải vượt qua trong hai thuộc tính; một số và một hàm / gọi lại, truy cập chúng trong lệnh bằng cách sử dụng attrsđối tượng.

Nếu chỉ thị là một chỉ thị phần tử, bị hạn chế với "E"tôi có thể:

<example-directive example-number="99" example-function="exampleCallback()">

Tuy nhiên, vì lý do tôi sẽ không đi vào, tôi cần chỉ thị là một chỉ thị thuộc tính.

Làm cách nào để chuyển nhiều thuộc tính vào một chỉ thị thuộc tính?


Điều đó phụ thuộc vào loại phạm vi chỉ thị của bạn tạo ra (nếu có). Các lựa chọn là: không có phạm vi mới (mặc định hoặc rõ ràng với scope: false), phạm vi mới (với sự kế thừa nguyên mẫu thông thường, nghĩa là, scope: true) và phạm vi cô lập (nghĩa là scope: { ... }). Chỉ thị của bạn tạo ra loại phạm vi nào?
Mark Rajcok

1
@MarkRajcok Nó có phạm vi cô lập.
Undistraction

Câu trả lời:


202

Lệnh có thể truy cập bất kỳ thuộc tính nào được xác định trên cùng một phần tử, ngay cả khi chính lệnh đó không phải là phần tử.

Bản mẫu:

<div example-directive example-number="99" example-function="exampleCallback()"></div>

Chỉ thị:

app.directive('exampleDirective ', function () {
    return {
        restrict: 'A',   // 'A' is the default, so you could remove this line
        scope: {
            callback : '&exampleFunction',
        },
        link: function (scope, element, attrs) {
            var num = scope.$eval(attrs.exampleNumber);
            console.log('number=',num);
            scope.callback();  // calls exampleCallback()
        }
    };
});

fiddle

Nếu giá trị của thuộc tính example-numbersẽ được mã hóa cứng, tôi khuyên bạn nên sử dụng $evalmột lần và lưu trữ giá trị. Biến numsẽ có loại chính xác (một số).


Tôi đã chỉnh sửa HTML ví dụ để sử dụng trường hợp rắn. Tôi biết tôi không thể sử dụng nó như là một yếu tố. Đó là điểm của câu hỏi.
Undistraction

@Pedr, yeah, xin lỗi tôi đã đọc quá nhanh về việc sử dụng phần tử. Tôi đã cập nhật câu trả lời, lưu ý rằng bạn cũng cần sử dụng trường hợp rắn cho các thuộc tính.
Mark Rajcok

Không vấn đề gì. Cảm ơn câu trả lời của bạn. Tôi đã chỉnh sửa tên thuộc tính để sử dụng trường hợp rắn. Bạn có ổn không nếu tôi loại bỏ nó khỏi câu trả lời của bạn vì đó chỉ là một lỗi ngớ ngẩn của tôi và làm sao lãng điểm của câu hỏi và câu trả lời thực tế?
Undistraction

Tôi không hiểu điều này - làm thế nào để chỉ thị biết cách đặt tên chính xác cho cùng một điều được chỉ định trong cách sử dụng lệnh ("exampleCallback ()") trong phạm vi của nó? ("gọi lại: '& exampleCallback') Không phải phạm vi là" gọi lại: "& exampleFunction"?
blaster

1
@FredrikL, để biết nhiều chỉ thị trên cùng một yếu tố, vui lòng xem stackoverflow.com/a/28735005/215945
Mark Rajcok

19

Bạn thực hiện chính xác theo cách tương tự như với chỉ thị phần tử. Bạn sẽ có chúng trong đối tượng attrs, mẫu của tôi có chúng ràng buộc hai chiều thông qua phạm vi cách ly nhưng điều đó không bắt buộc. Nếu bạn đang sử dụng một phạm vi riêng biệt, bạn có thể truy cập các thuộc tính bằng scope.$eval(attrs.sample)hoặc đơn giản là scope.sample, nhưng chúng có thể không được xác định tại liên kết tùy thuộc vào tình huống của bạn.

app.directive('sample', function () {
    return {
        restrict: 'A',
        scope: {
            'sample' : '=',
            'another' : '='
        },
        link: function (scope, element, attrs) {
            console.log(attrs);
            scope.$watch('sample', function (newVal) {
                console.log('sample', newVal);
            });
            scope.$watch('another', function (newVal) {
                console.log('another', newVal);
            });
        }
    };
});

được dùng như:

<input type="text" ng-model="name" placeholder="Enter a name here">
<input type="text" ng-model="something" placeholder="Enter something here">
<div sample="name" another="something"></div>

9

Bạn có thể truyền một đối tượng làm thuộc tính và đọc nó vào lệnh như thế này:

<div my-directive="{id:123,name:'teo',salary:1000,color:red}"></div>

app.directive('myDirective', function () {
    return {            
        link: function (scope, element, attrs) {
           //convert the attributes to object and get its properties
           var attributes = scope.$eval(attrs.myDirective);       
           console.log('id:'+attributes.id);
           console.log('id:'+attributes.name);
        }
    };
});

Có thể gửi một giá trị boolean bằng cách sử dụng một đối tượng? Tôi đã thử {{true}}nhưng nó vẫn trả về giá trị chuỗi true.
Peter Boomsma

4

Điều này làm việc cho tôi và tôi nghĩ là phù hợp với HTML5 hơn. Bạn nên thay đổi html của mình để sử dụng tiền tố 'data-'

<div data-example-directive data-number="99"></div>

Và trong chỉ thị đọc giá trị của biến:

scope: {
        number : "=",
        ....
    },

0

Nếu bạn "yêu cầu" 'exampleDirective' từ một lệnh khác + logic của bạn nằm trong bộ điều khiển 'exampleDirective' (giả sử 'exampleCtrl'):

app.directive('exampleDirective', function () {
    return {
        restrict: 'A',
        scope: false,
        bindToController: {
            myCallback: '&exampleFunction'
        },
        controller: 'exampleCtrl',
        controllerAs: 'vm'
    };
});
app.controller('exampleCtrl', function () {
    var vm = this;
    vm.myCallback();
});
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.