2

AngularJS アプリがあります。私はAngular で物事を行う正しい方法を学び、フレームワークをよりよく理解しようとしています。それを念頭に置いて、次のようなアプリがあります。

index.html

<!DOCTYPE html>
<html ng-app>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
    <script src="myControllers.js"></script>

    <style type="text/css">
        .init { border: solid 1px black; background-color: white; color: black; }

        .red { background-color:red; color:white; border:none; }
        .white { background-color: white; color: black; border:none; }
        .blue { background-color:blue; color:white; border:none; }
    </style>
</head>

<body ng-controller="StripeListCtrl">
    <select ng-options="stripe.id as stripe.name for stripe in stripes" ng-model="selectedStripe">
        <option value="">Select a Stripe Color</option>
    </select>

    <div ng-class="{{getStripeCss()}}">
        You chose {{selectedStripe.name}}
    </div>
</body>
</html>

mycontrollers.js

function StripeListCtrl($scope) {
    $scope.selectedStripe = null;
    $scope.stripes = [
      { name: "Red", id=2, css: 'red' },
      { name: "White", id: 1, css: 'white' },
      { name: "Blue", id: 5, css: 'blue' }
    ];

    $scope.getStripeCss = function() {
        if ($scope.selectedStripe == null) {
            return "init";
        }
        return $scope.selectedStripe.css;
    }
}

ユーザーがドロップダウンでオプションを選択したときに、DIV 要素のスタイルを動的に変更する方法を見つけようとしています。このとき、getStripeCss 関数が起動します。ただし、selectedStripe はストライプの ID です。XAML のバックグラウンドを持つ私は、オブジェクト全体を持つことに慣れています。ストライプ オブジェクトをループ処理して、対応する ID を持つオブジェクトを見つけるユーティリティ メソッドを作成できることは理解していますが、この種のタスクではかなり手作業のようです。

私が述べたようにユーティリティメソッドを書くよりもエレガントなアプローチはありますか? もしそうなら、どのように?

ありがとうございました!

4

1 に答える 1

4

getStripeCssこの機能は$scopeまったく必要ありません。

変数にオブジェクトを格納する場合は、次のようselectedStripeに変更する必要があります。ng-options

<select ng-options="stripe.name for stripe in stripes" ng-model="selectedStripe">
    <option value="">Select a Stripe Color</option>
</select>

<div ng-class="{red:selectedStripe.id==2, white:selectedStripe.id==1, 
blue:selectedStripe.id==5}">
    You chose {{selectedStripe.name}}
</div>

ただし、selectedStripe(現在行っているように) キーを格納し、stripes配列/オブジェクト内のアイテムにループせずにアクセスしたい場合は、次のようにすることができます。

<select ng-options="key as value.name for (key,value) in stripes" 
ng-model="selectedStripe">
    <option value="">Select a Stripe Color</option>
</select>

<div ng-class="{red:selectedStripe==2, white:selectedStripe==1, 
blue:selectedStripe==5}">
    You chose {{stripes[selectedStripe].name}}
</div>

モデルを変更します。

$scope.stripes = {
    2:{ name: "Red", id:2, css: 'red' },
    1:{ name: "White", id: 1, css: 'white' },
    5:{ name: "Blue", id: 5, css: 'blue' }
};
于 2013-09-17T11:39:10.670 に答える