İşaretlemede açısal kapsam değişkenini ayarlayın


96

Basit soru: Denetleyicim tarafından okunması için html'de bir kapsam değerini nasıl ayarlayabilirim?

var app = angular.module('app', []);

app.controller('MyController', function($scope) {
  console.log($scope.myVar);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='app'>
  <div ng-controller="MyController" app-myVar="test">
    {{myVar}}
  </div>
</div>

JSFiddle: http://jsfiddle.net/ncapito/YdQcX/


Bunu halletmek için bir yönerge oluşturmanız daha iyi olabilir. Bir yönerge şunları içerir: parametreler, bu yönergeye özgü bir denetleyici ve 'myMap' biçimlendirmesi için bir şablon.
Ian Mercer

Aslında yaptığım buydu ... sadece yönerge denetleyicisinde $ kapsam.myVar'a erişimle ilgili bazı sorunlar yaşıyorum. Kapsam değişkenlerine erişmek için neden denetleyicide bir izleme kullanmam gerekiyor?
Nix

1
Belki direktifinizi yayınlayabilirsiniz? Burada docs.angularjs.org/guide/directive " Transclusion ve kapsamları anlama" konusuna bir göz atın Muhtemelen kapsama ihtiyacınız vardır: {myVar: '='} ve my-var="foo"onu çağırdığınızda söylersiniz . Kısa çizgi ve camelCase kullanımına dikkat edin. Not: özniteliğin değerine erişmek için kapsam tanımında '@' kullanılmasını istemiyorsanız fooburada değerlendirilir .
Ian Mercer

1
@Nix Değerin neden denetleyiciniz yerine görünümde başlatılması gerektiğini açıklayabilir misiniz? Bunun değerleri ilklendirmenin geleneksel yolu olmadığını zaten bildiğinizi varsayıyorum (aksi takdirde sormazsınız) ve diğerleri kullanım durumunuzu daha iyi anlarlarsa size daha iyi yanıtlar verebilirler.
Sean the Bean

1
@SeantheBean genç ve aptaldım ...;) neden bunu yapmam gerektiğine dair hiçbir fikrim yok. Muhtemelen bir şeyi hacklemeye çalışıyordum.
Nix

Yanıtlar:


139

ng-initdöngü içinde değişkenler atarken çalışmaz. Kullanım {{myVariable=whatever;""}}

Sondaki "", Angular ifadesinin herhangi bir metin için değerlendirilmesini durdurur.

Ardından {{myVariable}}, değişken değerinizin çıktısını almak için basitçe çağırabilirsiniz .

Bunu birden çok iç içe diziyi yinelerken çok yararlı buldum ve mevcut yineleme bilgilerimi birden çok kez sorgulamak yerine tek bir değişkende tutmak istedim.


1
Bu işe yarasa da, hileli görünüyor. Diğer bir deyişle, {{}}değişkenleri atamak için değil, yalnızca tek bir değişkeni çıkarmak için kullanmak genellikle iyi bir uygulamadır . Stackoverflow.com/a/16799763/814160'ın daha doğru olduğunu söyleyebilirim (görünümde daha az JS kodu).
Sean the Bean

1
@SeantheBean için +1 - Bunu test ettim. Alt denetleyicilerle ve değişkeni işaretlemede atamanın kapsamı ile ilgili sorunlar var gibi görünüyor. Direktif benim amaçlarım için çalışıyor ve sağlam bir çözüm gibi görünüyor.
Paul Carlton

2
Bu, angular2 / 4'te işe yaramıyor gibi görünüyor - Bağlamalar atamaları içeremez
Demodave

1
@Demodave bunun yerine tüm denetleyici değişkenlerinizi Typescript kodunda ayarlamalı ve şablonu yalnızca Typescript'i HTML'ye bağlamak için kullanmalısınız. Şablon, değişken atamamalıdır.
boxmein

81

ngInit değişkenleri başlatmaya yardımcı olabilir.

<div ng-app='app'>
    <div ng-controller="MyController" ng-init="myVar='test'">
        {{myVar}}
    </div>
</div>

jsfiddle örneği


3
Onlar gerçek uygulamalar için bu çözümü önermiyoruz unutulmamalıdır (ama gerçekten bir alternatif önermiyoruz): docs.angularjs.org/guide/dev_guide.mvc.understanding_model
Mike Robinson

Bu benim için çalıştı, ancak ilk başta değişken kontrolörde hala tanımsızdı. Küçük bir aralık döngüsü yaptım: var interval = setInterval (function () {if ($ kapsam.whatever) {// dostuff clearInterval (interval);}}, 10);
roelleor

19

Adlı bir yönerge oluşturma myVarile

scope : { myVar: '@' }

ve şöyle diyelim:

<div name="my_map" my-var="Richmond,VA">

Tirelenmiş etiket adına yönelik direktifte özellikle deve durumu referansına dikkat edin.

Daha fazla bilgi için "Transclusion and Scopes Anlama" bölümüne bakın: - http://docs.angularjs.org/guide/directive

Burada , bir yönerge içinde çeşitli farklı şekillerde özniteliklerdeki değerleri kapsam değişkenlerine nasıl kopyalayabileceğinizi gösteren bir Fiddle .


Birden fazla yapabilmek istiyorum var-nick='my' var-nick2='test'. Bunu sadece kullanacağım direktiflerle uygulamanın bir yolunu düşünemediğiniz süreceng-init
Nix

Kapsama birden çok öznitelik dahil edebilirsiniz, tek ihtiyacınız olan şeylerden birinin yürütmek istediğiniz yönergenin adı olması (veya bu yönerge adını html'ye de dahil etmeniz). scope: {varNick: '@', varNick2: '@'}
Ian Mercer

Ancak ölçeklenebilir değil mi? Değişken başına bir yönerge tanımlamam gerekir mi?
Nix

Hayır, değişken başına bir yönergeye ihtiyacınız yoktur. Cevaba eklediğim kemana bir bak.
Ian Mercer

Üzgünüm okumayı özledim, örneğiniz mükemmel, benim tek değişikliğim kapsam {'@': '@ "} oldu.
Nix

10

Değerleri html'den bu şekilde ayarlayabilirsiniz. Henüz açısaldan doğrudan bir çözüm olduğunu düşünmüyorum.

 <div style="visibility: hidden;">{{activeTitle='home'}}</div>

7
Güzel hack ... <div style="display: none">Ancak tavsiye ederim .
Roger

3

ng-initAşağıda gösterildiği gibi kullanabilirsiniz

<div class="TotalForm">
  <label>B/W Print Total</label>
  <div ng-init="{{BWCount=(oMachineAccounts|sumByKey:'BWCOUNT')}}">{{BWCount}}</div>
</div>
<div class="TotalForm">
  <label>Color Print Total</label>
  <div ng-init="{{ColorCount=(oMachineAccounts|sumByKey:'COLORCOUNT')}}">{{ColorCount}}</div>
</div>

ve sonra diğer bölümlerde yerel kapsam değişkenini kullanın:

<div>Total: BW: {{BWCount}}</div>
<div>Total: COLOR: {{ColorCount}}</div>

Bu yaklaşımı beğendim; daha az huysuz görünüyor. Yine de bir açıklama, ng-init'in kıvırcık parantezlere ihtiyacı yoktur.
mklbtz

1
$scope.$watch('myVar', function (newValue, oldValue) {
        if (typeof (newValue) !== 'undefined') {
            $scope.someothervar= newValue;
//or get some data
            getData();
        }


    }, true);

Değişken, denetleyiciden sonra başlar, bu nedenle onu izlemeniz gerekir ve kullanımı başlatmadığında.


0

Cevabı beğendim, ancak ihtiyaç duyulan kapsam değişkenini ayarlamanıza izin verecek global bir kapsam işlevi oluşturmanızın daha iyi olacağını düşünüyorum.

Yani globalController'da

$scope.setScopeVariable = function(variable, value){
    $scope[variable] = value;
}

ve sonra html dosyanızda onu arayın

{{setScopeVariable('myVar', 'whatever')}}

Bu, daha sonra ilgili denetleyicinizde $ kapsam.myVar'ı kullanmanıza izin verecektir.


0

Bir döngüde değilseniz, ng-init'i kullanabilirsiniz, aksi takdirde kullanabilirsiniz.

{{var=foo;""}}

"" değişkeninizi göstermez

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.