AngularJS_2 Scope

(This is the note of angular course in HKUST.)

Scope is the core part of Angular’s two-way binding, it’s the ‘glue’ between controller and view. The controller set properties to the scope and the view get the view binds to the properties. Then the angular will keep the values in sync.

在实际操作中,每个ng-app标签下将生成一个rootScope,而每个Controller都将生成一个基于rootScope的子Scope,用于绑定数据与函数。在使用Scope之后,HTML代码中不再需要再前置Controller的名字,只要将Controller赋值给ng-controller参数即可。子Scope中可以使用父节点的函数或值。

另外,在同时使用angular与gulp时,需要引入gulp-ng-annotate,并在JS文件执行uglify之前执行该工作。当然,首先要require进来。

gulp.task('usemin', ['jshint'],
function() {
    return gulp.src('./app/index.html').pipe(usemin({
        css: [minifycss(), rev()],
        js: [ngannotate(), uglify(), rev()]
    })).pipe(gulp.dest('dist/'));
});

There is ngShow order been used, the HTML code is as followed.

<!DOCTYPE html>
<html lang="en" ng-app="confusionApp">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head
         content must come *after* these tags -->
    <title>Ristorante Con Fusion: Menu</title>
        <!-- Bootstrap -->
<!-- build:css styles/main.css -->
    <link href="../bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="../bower_components/bootstrap/dist/css/bootstrap-theme.min.css" rel="stylesheet">
    <link href="../bower_components/font-awesome/css/font-awesome.min.css" rel="stylesheet">
    <link href="styles/bootstrap-social.css" rel="stylesheet">
    <link href="styles/mystyles.css" rel="stylesheet">
<!-- endbuild -->

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>

<body>

    <div class="container">
        <div class="row row-content" ng-controller="MenuController">
            <div class="col-xs-12">

                <button ng-click="toggleDetails()" class="btn btn-xs btn-primary pull-right" type="button">
                    {{showDetails ? 'Hide Details':'Show Details'}}
                </button>  

                <ul class="nav nav-tabs" role="tablist">
                    <li role="presentation" ng-class="{active:isSelected(1)}">
                        <a ng-click="select(1)" aria-controls="all menu" role="tab">Menu</a></li>
                    <li role="presentation" ng-class="{active:isSelected(2)}">
                        <a ng-click="select(2)" aria-controls="appetizers" role="tab">Appetizers</a></li>
                    <li role="presentation" ng-class="{active:isSelected(3)}">
                        <a ng-click="select(3)" aria-controls="mains" role="tab">Mains</a></li>
                    <li role="presentation" ng-class="{active:isSelected(4)}">
                        <a ng-click="select(4)" aria-controls="desserts" role="tab">Desserts</a></li>
                </ul>

                <div class="tab-content">
                    <ul class="media-list tab-pane fade in active">
                        <!-- only the dish variable who pass the filter will be enabled -->
                        <!-- the filter is quiet strange, seems that it will look through all the parameters of the object and find whether the key word exists -->
                        <li class="media" ng-repeat="dish in dishes | filter:filtText">
                            <div class="media-left media-middle">
                                <a href="#"><img class="media-object img-thumbnail" ng-src={{dish.image}} alt="Uthappizza"></a>
                            </div>
                            <div class="media-body">
                                <h2 class="media-heading">
                                    {{dish.name}}
                                    <span class="label label-danger">{{dish.label}}</span>
                                    <!-- use the filter to show price in a proper way -->
                                    <span class="badge">{{dish.price | currency}}</span>
                                </h2>

                                <!-- this ng-show detail is assigned by a global variable, you can find it in the angular.js -->
                                <p ng-show="showDetails">{{dish.description}}</p>
                            </div>
                        </li>
                    </ul>
                </div>

            </div>
        </div>
    </div>
<!-- build:js scripts/main.js -->
    <script src="../bower_components/angular/angular.min.js"></script>
    <script src="scripts/angular.js"></script>
<!-- endbuild -->

</body>
</html>

The JS code is:

'use strict';

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

app.controller('MenuController', ['$scope', function($scope) {

    $scope.showDetails = false;

    $scope.tab = 1;

    $scope.filtText = '';

    // use the decide which tab is enabled
    $scope.isSelected = function (checkTab) {
        return ($scope.tab === checkTab);
    }

    // use to change the tab value and filter value
    $scope.select = function(setTab) {
        $scope.tab = setTab;

        if (setTab === 2)
            $scope.filtText = "appetizer";
        else if (setTab === 3)
            $scope.filtText = "mains";
        else if (setTab === 4)
            $scope.filtText = "dessert";
        else
            $scope.filtText = "";
    }

    $scope.dishes=[
        {
            name:'Uthapizza',
            image: 'images/uthapizza.png',
            category: 'mains',
            label:'Hot',
            price:'4.99',
            description:'A unique combination of Indian Uthappam (pancake) and Italian pizza, topped with Cerignola olives, ripe vine cherry tomatoes, Vidalia onion, Guntur chillies and Buffalo Paneer.',
            comment: ''
        },
        {
            name:'Zucchipakoda',
            image: 'images/zucchipakoda.png',
            category: 'appetizer',
            label:'',
            price:'1.99',
            description:'Deep fried Zucchini coated with mildly spiced Chickpea flour batter accompanied with a sweet-tangy tamarind sauce',
            comment: ''
        },
        {
            name:'Vadonut',
            image: 'images/vadonut.png',
            category: 'appetizer',
            label:'New',
            price:'1.99',
            description:'A quintessential ConFusion experience, is it a vada or is it a donut?',
            comment: ''
        },
        {
            name:'ElaiCheese Cake',
            image: 'images/elaicheesecake.png',
            category: 'dessert',
            label:'',
            price:'2.99',
            description:'A delectable, semi-sweet New York Style Cheese Cake, with Graham cracker crust and spiced with Indian cardamoms',
            comment: ''
        }];

    $scope.toggleDetails = function() {
        $scope.showDetails = !$scope.showDetails;
    };

}]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值