Angular.js öznitelik yönergesine birden çok özniteliği nasıl iletirim?


116

Aşağıdaki gibi kısıtlanmış bir öznitelik direktifim var:

 restrict: "A"

İki niteliğe geçmem gerekiyor; bir numara ve bir işlev / geri arama, attrsnesneyi kullanarak yönerge içinde bunlara erişme .

Direktif bir element direktifiyse, bununla sınırlı "E"olabilir:

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

Ancak, girmeyeceğim nedenlerden dolayı yönergenin bir öznitelik yönergesi olmasına ihtiyacım var.

Bir öznitelik yönergesine birden çok özniteliği nasıl aktarırım?


Bu, direktifinizin (varsa) oluşturduğu kapsam türüne bağlıdır. Seçenekler şunlardır: yeni kapsam yok (varsayılan veya açık scope: false), yeni kapsam (normal prototip devralma ile, yani scope: true) ve izolasyon kapsamı (yani, scope: { ... }). Yönergeniz ne tür bir kapsam yaratıyor?
Mark Rajcok

1
@MarkRajcok İzolat kapsamı vardır.
Undistraction

Yanıtlar:


202

Yönerge, kendisi bir öğe olmasa bile, aynı öğede tanımlanan herhangi bir özniteliğe erişebilir.

Şablon:

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

Direktif:

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

Özniteliğin değeri example-numbersabit kodlanacaksa, bir $evalkez kullanılmasını ve değerin saklanmasını öneririm . Değişken numdoğru türe (bir sayı) sahip olacaktır.


Snake-case'i kullanmak için örnek HTML'yi düzenledim. Bunu bir unsur olarak kullanamayacağımı biliyorum. Sorunun amacı bu.
Undistraction

@Pedr, evet, öğe kullanımı hakkında çok hızlı okudum. Öznitelikler için de yılan kılıfı kullanmanız gerektiğini belirterek yanıtı güncelledim.
Mark Rajcok

Sorun değil. Cevabınız için teşekkürler. Snake-case'i kullanmak için öznitelik adlarını düzenledim. Benim tarafımdan aptalca bir hata olduğu ve asıl soru ve cevap açısından dikkati dağıttığı için bunu cevabınızdan çıkarırsam iyi olur musunuz?
Undistraction

Bunu anlamıyorum - yönerge, kapsamındaki yönerge kullanımında ("exampleCallback ()") belirtilen aynı şeyi adlandırmayı nasıl biliyor? ("callback: '& exampleCallback') Kapsam" callback: "& exampleFunction" olmamalı mı?
blaster

1
@FredrikL, aynı öğe üzerinde birden fazla yönerge için lütfen stackoverflow.com/a/28735005/215945
Mark Rajcok

19

Bunu, bir element direktifinde yaptığınız gibi yaparsınız. Bunları attrs nesnesine sahip olacaksınız, benim örneğim onları izolat kapsamı aracılığıyla iki yönlü bağlamaya sahip ancak bu gerekli değil. İzole edilmiş bir kapsam kullanıyorsanız, özniteliklere kapsam. scope.$eval(attrs.sample)Örnek ile veya basitçe erişebilirsiniz, ancak durumunuza bağlı olarak bağlanmada tanımlanmayabilirler.

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);
            });
        }
    };
});

olarak kullanılır:

<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

Bir nesneyi öznitelik olarak iletebilir ve aşağıdaki gibi yönergeye okuyabilirsiniz:

<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);
        }
    };
});

Bir nesne kullanarak bir boole değeri göndermek mümkün müdür? Denedim {{true}}ama yine de dize değerini döndürüyor true.
Peter Boomsma

4

Bu benim için çalıştı ve bence daha HTML5 uyumlu. 'Data-' önekini kullanmak için html'nizi değiştirmelisiniz

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

Yönerge içinde değişkenin değerini okuyun:

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

0

Başka bir yönergeden 'exampleDirective' için "gerekli" iseniz + mantığınız 'exampleDirective'in' kontrolcüsündeyse ("exampleCtrl" diyelim):

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();
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.