使用AngularJS操作表

时间:2014-08-19 09:37:35

标签: javascript angularjs dom

我使用指令操作带有angularjs的html表。一切都运作良好,但我有一个问题,我无法解决并理解它出现的原因。

这是我的控制器

  var gameApp = angular.module("gameApp", ['ngRoute','ngSanitize']);

gameApp.service('link', function() {
    this.user = false;
});
gameApp.filter('unsafe', function($sce) {
    return function(val) {
        return $sce.trustAsHtml(val);
    };
});

gameApp.directive('mapActivity', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attr) {
            scope.$watch(attr.ngBindHtml, function(value) {

                angular.element('.click#1').addClass('dotted').html($("<img src='images/dot.png'>"));
                var j = null;
                for(var i = 1; i <= 4; i++)
                {
                    $.ajax({
                        type: 'GET',
                        url: 'lib/terrain.php',
                        dataType: 'html',
                        data: {i: i},
                        success: function(data) {
                            var randomRuta = Math.floor((Math.random() * 100) + 1);
                            angular.element('.click#'+randomRuta).addClass('monster').html($("<img src='images/blackdot.png' title='"+data+"'>"));
                        },
                        error: function(xhr, ajaxOptions, thrownError) { alert(thrownError); }
                    });
                    j=i;
                }  
                angular.element('.click').click(function() {
                if(angular.element(this).hasClass('monster'))
                {
                    if(confirm('Vill du anfalla monster?'))
                    {
                        alert("Du vann");
                        angular.element('.click.monster'+j).empty();
                        angular.element('.click.monster').removeClass('monster'+j);

                        angular.element('.click.dotted').empty();
                        angular.element('.click.dotted').removeClass('dotted');
                        angular.element(this).addClass('dotted');
                        angular.element('.click.dotted').html($('<img src="images/dot.png">'));
                    }
                }
                else
                {
                    angular.element('.click.dotted').empty();
                    angular.element('.click.dotted').removeClass('dotted');

                    if(!angular.element(this).hasClass('dotted'))
                    {
                        angular.element(this).addClass('dotted');
                        angular.element(this).html($('<img src="images/dot.png">'));
                    }
                }

                });                     
            });
        }
    };
});

function makeTableFrom(str) {
    var k = 1;
    result = "";

    for(var i = 1; i <= 8; i++) {
        result += '<tr>';

        for(var j = 1; j <= 20; j++) {
            if(str[k] == '#') {
                result += '<td id=' + k + '">#</td>';
            }
            else if(str[k] == '&') {
                result += '<td class="click" val="water" id="' + k + '">&</td>';
            }
            else {
                result += '<td class="click" id="' + k + '"></td>';
            }

            k++;
        }
        result += '</tr>';
    }
    return result;
}


gameApp.config(function($routeProvider) {
    $routeProvider

    .when('/', {
            templateUrl : 'partials/firstpage.html',
            controller  : 'firstPageCtrl'
    })

    .when('/game', {
            templateUrl : 'partials/game.html',
            controller  : 'gameCtrl'
    });

});

gameApp.controller("firstPageCtrl", function($scope,$http,link,$location) {
    $scope.doLogin = function() {
        $http.post("lib/action.php", {username: $scope.username, password: $scope.password}).success(function(data) {
            if(data) {
                link.user = data;
                console.log(link.user);
                $location.path("/game");
            }
        }).error(function(data) {
            console.log(data);
        });
    };
});


gameApp.controller("gameCtrl", function($scope,$http,link,$location,$sce,$rootScope) {

    $scope.getMonsters = "1";

    $http.post("lib/action.php", {monsters: $scope.getMonsters}).success(function(data) {
        $scope.result = makeTableFrom(data);
    });

    $scope.safeHtml = function() {
        return $sce.trustAsHtml($scope.result);
    };
    if(link.user) {
        /*$scope.message = "fisk";
        console.log(link.user);*/
    } else {
        /*$scope.message = "Ledsen fisk";
        console.log("Är inte satt");*/
    }

});

黑点按预期打印出来,但红点是在范围之后定义的。$ watch未执行:angular.element(&#39; .click#1&#39;)。addClass(& #39;点缀&#39;。)HTML($(&#34;&#34));

该行未执行,但下面的所有其他代码均为。那是为什么?

这是我的HTML

<div ng-controller="gameCtrl" map-Activity>
    <table ng-bind-html="safeHtml()">
    </table>
</div>

0 个答案:

没有答案