javascript - 如何在 .on click 事件中使用 $scope ?

标签 javascript jquery angularjs

我对 Angular js 非常陌生,正在使用一个简单的数据解析器项目测试一些功能 (Plunkr) 。现在,我在点击事件中的 jQuery 中访问 $scope 变量时遇到问题。我想隐藏一些元素,直到单击图像。虽然我可以在 Controller 中将 ng-hide 设置为 true,但 $scope 似乎无法在单击处理程序中工作。请帮忙。

zodiac.html

<!DOCTYPE html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>

<body>

    <div id="container" ng-app="myApp" ng-controller="myCtrl">
        <div>
            <h1>What Animal Are You?</h1>
            <div id="selectPicture"></div>
        </div>
        <div id="zodiac" ng-hide="disappear">
            <h1>Your Zodiac</h1>
            <div id="your-zodiac">
            </div>
            <br>
            <h1>Avoid these Animals</h1>
            <div id="hateDiv">
            </div>
            <br>
            <h1>These Are Your Besties</h1>
            <div id="loveDiv">
            </div>
        </div>
        <script src="scripts.js"></script>
    </div>
</body>

脚本.js

function d(c) {
    console.log(c)
}

var app = angular.module('myApp', [])
app.controller('myCtrl', function($scope, $http) {
    $http.get('zodiac.json').success(function(data) {
        $scope.disappear = true //WORKS HERE
        $scope.animalsData = data
        angular.forEach($scope.animalsData, function(item) {
            $('#selectPicture').prepend('<img src="' + item.picture + '" alt="' + item.animal + '">')
        })
        $('#selectPicture').on('click', 'img', function($scope) {
            $scope.disappear = false //DOES NOT WORK HERE
            $('#zodiac div').empty();
            findZodiac(this.alt, "#your-zodiac", true);
        })

        function findZodiac(animal, e, test) {
            angular.forEach($scope.animalsData, function(item) {
                if (item.animal == animal) { //look for the right object 'item', when found, get the image
                    //item.picture
                    $(e).prepend('<img src="' + item.picture + '">')
                    if (test == true) {
                        loveHate(item.hate, "#hateDiv")
                        loveHate(item.love, "#loveDiv")
                    }
                    return
                }
            })
        }

        function loveHate(array, e) {
            angular.forEach(array, function(value) { //loops through an array, get each animal
                findZodiac(value, e, false)
            })
        }
    });

})

最佳答案

在我看来,在使用 AngularJS 时不应该直接进行 DOM 操作。请改用 AngularJS 提供的指令。如果您这样做,这里是模板和 Controller 代码 -

zodiac.html

<!DOCTYPE html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>

<body>
    <div id="container" ng-app="myApp" ng-controller="myCtrl">
        <div>
            <h1>What Animal Are You?</h1>
            <div id="selectPicture">
                <img ng-repeat="animal in animalsData"
                     ng-src="{{animal.picture}}"
                     alt="{{animal.animal}}" 
                     ng-click="disappear=false; findZodiac(animal)" />
            </div>
        </div>
        <div id="zodiac" ng-hide="disappear">
            <h1>Your Zodiac</h1>
            <div id="your-zodiac">
                <img ng-src="{{selectedAnimal.picture}}" alt="{{selectedAnimal.animal}}" />
            </div>
            <br>
            <h1>Avoid these Animals</h1>
            <div id="hateDiv">
                <img ng-repeat="animal in selectedAnimal.hate"
                     ng-src="{{animal.picture}}"
                     alt="{{animal.animal}}" />
            </div>
            <br>
            <h1>These Are Your Besties</h1>
            <div id="loveDiv">
                <img ng-repeat="animal in selectedAnimal.love"
                     ng-src="{{animal.picture}}"
                     alt="{{animal.animal}}" />
            </div>
        </div>
        <script src="scripts.js"></script>
    </div>
</body>

脚本.js

var app = angular.module('myApp', [])
app.controller('myCtrl', function($scope, $http) {
    $scope.animalsData = [];
    $scope.selectedAnimal = {};
    $scope.disappear = true;

    $scope.findZodiac = function(animal) {
        $scope.selectedAnimal = animal;
    };

    $http.get('zodiac.json').success(function(data) {
        $scope.animalsData = data;
    });

});

关于javascript - 如何在 .on click 事件中使用 $scope ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42060834/

相关文章:

javascript - 如何查看第一个 Angular 模板?

javascript - 如何让单选按钮选择另一个单选按钮的值

javascript - 带有 'element' 嵌入的 Angular 模板

javascript - 通过字符串名称访问 parseJSON

jquery - IE9不执行Ajax请求

javascript - 如何通过 URL 属性创建 JavaScript 操作?

javascript - css3 transition 和 javascript 出错了

javascript - 引用内存可供 2 个 Controller 进行通信

javascript - 在javascript中删除文本文本的某些部分

javascript - Vue 为不同的环境设置不同的 vue.config.js 配置