マークアップで角度スコープ変数を設定する


94

簡単な質問:スコープの値をhtmlに設定して、コントローラーで読み取るにはどうすればよいですか?

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/


これを処理するためのディレクティブを作成した方がよい場合があります。ディレクティブは、パラメーター、このディレクティブに固有のコントローラー、および「myMap」マークアップのテンプレートをカプセル化します。
Ian Mercer 2013年

それは実際に私がやったことです...ディレクティブコントローラーで$ scope.myVarにアクセスするときにいくつかの問題があります。スコープ変数にアクセスするためにコントローラーでウォッチを使用する必要があるのはなぜですか?
Nix

1
多分あなたはあなたの指令を投稿することができますか?見てみましょう「の理解トランスクルーをし、スコープ」ここdocs.angularjs.org/guide/directive あなたにおそらく必要とする範囲:{myVarに:「=」}を、あなたは言うでしょうmy-var="foo"、あなたはそれを呼び出すとき。ハイフンとキャメルケースの使用に注意してください。注:スコープ定義で「@」を使用して属性の値にアクセスしたくない場合fooは、ここで評価されます。
Ian Mercer

1
@Nixコントローラではなくビューで値を初期化する必要がある理由を説明できますか?これは値を初期化する従来の方法ではないことをすでに知っていると思います(そうしないと、質問しません)。ユースケースをよりよく理解していれば、他の人がより良い答えを出すことができます。
Sean the Bean

1
@SeantheBean私は若くて愚かでした...;)私はなぜそれをする必要があったのか分かりません。私はおそらく何かをハックしようとしていた。
Nix 2016年

回答:


138

ng-initループ内で変数を割り当てる場合は機能しません。使用する {{myVariable=whatever;""}}

末尾""は、任意のテキストに対して評価されるAngular式を停止します。

次に、呼び出し{{myVariable}}て変数値を出力できます。

複数のネストされた配列を反復するときにこれは非常に便利であり、現在の反復情報を複数回クエリするのではなく1つの変数に保持したいと思いました。


1
これは機能しますが、ハックのようです。つまり、{{}}変数を割り当てるためではなく、単一の変数を出力するためだけに使用することが一般的には良い習慣です。私は、stackoverflow.com / a / 16799763/814160の方が正しいと思います(ビューのJSコードが少ない)。
Sean the Bean

1
@SeantheBeanの+1-これをテストしました。子コントローラーと、マークアップで変数を割り当てるスコープに問題があるようです。ディレクティブは私の目的に合わせて機能し、確実な解決策のようです。
Paul Carlton

2
これはangular2 / 4では機能しないようです-バインディングに割り当てを含めることはできません
Demodave

1
@Demodaveでは、代わりにすべてのコントローラー変数をTypescriptコードで設定し、TypescriptをHTMLに接続するためにのみテンプレートを使用する必要があります。テンプレートは変数を割り当てるべきではありません。
boxmein

80

ngInit 変数の初期化に役立ちます。

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

jsfiddleの例


3
実際のアプリにはこのソリューションを推奨していません(ただし、代替案は提案していません)。docs.angularjs.org
Mike Robinson

これは私にとってはうまくいきましたが、最初は変数がコントローラーでまだ定義されていませんでした。私は少し間隔ループを作りました:var interval = setInterval(function(){if($ scope.whatever){// dostuff clearInterval(interval);}}、10);
roelleor 2015年

19

呼ばれるディレクティブを作成myVarしてし

scope : { myVar: '@' }

次のように呼び出します:

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

特に、ハイフネーションされたタグ名へのディレクティブ内のラクダのケース参照に注意してください。

詳細については、「トランスクルージョンとスコープについて」を参照してください。- http : //docs.angularjs.org/guide/directive

以下は、ディレクティブ内のさまざまな方法で属性からスコープ変数に値をコピーする方法を示すフィドルです。


複数のことができるようになりたいですvar-nick='my' var-nick2='test'。ディレクティブを使用してそれを実装する方法を考えることができない限り、私は使用するつもりですng-init
Nix

スコープには複数の属性を含めることができます。必要なのは、それらの1つを実行するディレクティブの名前にすることだけです(またはHTMLにそのディレクティブ名も含めます)。 scope: {varNick: '@', varNick2: '@'}
Ian Mercer

しかし、それはスケーラブルではありませんか?変数ごとにディレクティブを定義する必要がありますか?
Nix

いいえ、変数ごとにディレクティブは必要ありません。答えに追加したフィドルを見てください。
Ian Mercer 2013年

すみません、読んでいません。あなたの例は完璧です、私の唯一の変更はスコープです{'@': '@ "}
Nix

10

このようにhtmlから値を設定できます。角度からの直接的な解決策はまだないと思います。

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

7
素敵なハック... <div style="display: none">しかし、お勧めします。
Roger

3

ng-init以下のように使用できます

<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>

次に、他のセクションでローカルスコープ変数を使用します。

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

私はこのアプローチが好きです。ハックが少ないようです。ただし、1つの説明として、ng-initでは中括弧は必要ありません。
mklbtz 2018年

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


    }, true);

変数はコントローラーの後に初期化されるため、それを監視する必要があり、初期化されていない場合は使用します。


0

私は答えが好きですが、必要なスコープ変数を設定できるグローバルスコープ関数を作成する方が良いと思います。

したがって、globalControllerで作成

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

そしてあなたのhtmlファイルでそれを呼び出します

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

これにより、それぞれのコントローラーで$ scope.myVarを使用できるようになります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.