Функция .innerHTML не работает в angular JS

У меня есть это приложение для голосования, над которым я работаю, я внедрил кнопку входа в facebook, я решил показать какую-то кнопку, когда пользователь подключен, поэтому должен быть включен для голосования, однако моя кнопка ng-click не работает, пожалуйста, помогите

тег html-скрипта

       // for FB.getLoginStatus().
    if (response.status === 'connected') {
      // Logged into your app and Facebook.
      var elems = document.getElementsByClassName("voters");
for(i=0; i<elems.length; i++){

      elems[i].innerHTML("<div class='selector'> <a class='btn btn-lg btn-warning' ng-click='upVote(item)'><b> VOTE</b></a></div>");
      $compile(elems[i])($scope);
      }
      testAPI();
    } 
    else if (response.status === 'not_authorized') 
    {
      // The person is logged into Facebook, but not your app.
      //document.getElementById('status').innerHTML = 'Please log ' +
       // 'into this app.';

       document.getElementById('status').innerHTML =
        'You Are Not Logged In ... Please Login To Vote!';
     var elems = document.getElementsByClassName("voters");
for(i=0; i<elems.length; i++){
       elems[i].innerHTML = '';
   }
    } else {

        document.getElementById('status').innerHTML =
        'You Are Not Logged In ... Please Login To Vote!';
      // The person is not logged into Facebook, so we're not sure if
      // they are logged into this app or not.
     var elems = document.getElementsByClassName("voters");
for(i=0; i<elems.length; i++){
       elems[i].innerHTML = '';
   }

тело html с ng-repeat

    <div class="col-md-3" ng-repeat="item in contestant | filter: search | orderBy:artistOrder:direction" style="margin-bottom:30px">
        <div class="row text-center">
        <p>
            <img ng-src="uploads/{{item.ImageUrl}}" class="vote-img">

            </p>
        </div>
        <div class="row ">
            <div class="col-md-6 text-center">
                <p class="contest-text">{{item.Name}}</p>
            </div>
                <div class="col-md-6 text-center">
                <p class="contest-text"><span class="glyphicon glyphicon-thumbs-up"> {{item.Votes}} Votes </span></p>
            </div>
        </div>
                <div class="row text-center">
<p class="contest-text voters"><!--<a class="btn btn-lg btn-warning" ng-click="upVote(item);"><b> VOTE</b></a>--> </p>
        </div>
    </div>

контроллер в angularjs

var artistController = angular.module("artistController", []);


 /* artistController.directive('ngbutton', function() {
    return {
      restrict: "E",
      template: "<a class='btn btn-lg btn-warning' data-ng-click='upVote(item)'><b> VOTE</b></a>"
    };
  });*/

artistController.controller("ListController", ['$scope', '$http',function($scope, $http){

    $http.get('ajax/getContestant.php').success(function(data){


         $scope.contestant = data;
            // $scope.artistOrder = 'name';
    });
    $scope.upVote = function(item){

    item.Votes++;
    updateVote(item.ID,item.Votes);
  };

    function updateVote(id,votes){
    $http.post('ajax/updateVote.php?id='+id+'&votes='+votes);
  }

}]);
artistController.controller("DetailsController", ['$scope', '$http','$routeParams',function($scope, $http,$routeParams){

    $http.get('js/data.json').success(function(data){


         $scope.artists  = data;
        $scope.whichItem = $routeParams.itemID;

        if ($routeParams.itemID > 0) {

            $scope.prevItem = Number($routeParams.itemID) -1;
        }
        else{

            $scope.prevItem = $scope.artists.length -1;
        }

if ($routeParams.itemID < $scope.artists.length -1) {

            $scope.nextItem = Number($routeParams.itemID) +1;
        }
        else{

            $scope.nextItem = 0;
        }
    });

}]);

кнопка ng-click не работает, помогите


person Abiodun    schedule 13.11.2014    source источник
comment
Лучший способ - написать пользовательские директивы с прикрепленными шаблонами. используйте ng-if/ng-show, чтобы скрыть и показать элементы в зависимости от статуса приложения.   -  person erandac    schedule 13.11.2014
comment
пожалуйста, как мне это сделать .. можете ли вы дать мне пример кода для этого .. спасибо   -  person Abiodun    schedule 13.11.2014
comment
Избегайте использования innerHTML для манипуляций с домом. Вместо этого объявите все возможные элементы в вашем шаблоне/теле. Например, сообщение о статусе «not_authorized» также доступно в вашем html-файле. Видимостью таких элементов можно управлять директивами ng-if. например: ng-if=неавторизованный. В вашем контроллере объявите необходимые переменные и поддерживайте соответствие состояния. Просто, когда регистрация FB не удалась, вы устанавливаете notAuthorized = true. И ваш элемент dom может выглядеть так =› ‹span ng-if=notAuthorized›Вы не вошли в систему ... Пожалуйста, войдите, чтобы проголосовать!'‹/span›   -  person erandac    schedule 14.11.2014
comment
не могли бы вы просто вставить мне пример кода того, как будет выглядеть мой контроллер .. буду очень признателен .. спасибо в ожидании   -  person Abiodun    schedule 14.11.2014


Ответы (1)


Пример не завершен, я просто извлек из вашего кода. но идея состоит в том, чтобы показать, как можно избежать использования innerHTML для манипуляций с домом. Обратите внимание, что я исказил html с новым контроллером «LoginCtrl», он должен реализовать логику входа в систему.

Мне было интересно, почему вы добавляете элемент кнопки голосования с помощью innerHTML, но вы можете просто объявить его в шаблоне. Проверьте следующий шаблон.

HTML-код тела:

 <div ng-controller="LoginCtrl">

    <!-- auth user section -->
    <div ng-if="!notAuthorized" >
        <div ng-controller="ListController" >
            <div class="col-md-3" ng-repeat="item in contestant | filter: search | orderBy:artistOrder:direction" style="margin-bottom:30px">
                <div class="row text-center">
                    <p>
                        <img ng-src="uploads/{{item.ImageUrl}}" class="vote-img">
                    </p>
                </div>
                <div class="row ">
                    <div class="col-md-6 text-center">
                        <p class="contest-text">{{item.Name}}</p>
                    </div>
                    <div class="col-md-6 text-center">
                        <p class="contest-text"><span class="glyphicon glyphicon-thumbs-up"> {{item.Votes}} Votes </span></p>
                    </div>
                </div>
                <div class="row text-center">
                    <div class="contest-text voters"> 

                    <!-- I extarcted the html from javascript code -->
                        <div class='selector'> <a class='btn btn-lg btn-warning' ng-click='upVote(item)'><b> VOTE</b></a></div>
                    </div>
                </div>
            </div>
            <div ng-repeat="item in voters" class='selector'> <a class='btn btn-lg btn-warning' ng-click='upVote(item)'><b> VOTE</b></a></div>
        </div>
    </div>

    <!-- login section (not auth) -->
    <div ng-if="notAuthorized">
        You Are Not Logged In ... Please Login To Vote!
    </div>

</div>

Контроллер:

artistController.controller("LoginCtrl",['$scope',function($scope)
{
    $scope.notAuthorized = true;

    var response = {}; //TODO init FB response

    // for FB.getLoginStatus().
    if (response.status === 'connected') 
    {
      // Logged into your app and Facebook.
        $scope.notAuthorized = false;
    } 

}]);
person erandac    schedule 14.11.2014
comment
не могли бы вы отредактировать этот код, чтобы включить API facebook и как он будет работать.. извините, если это много работы, но я новичок в angularjs и facebook sdk.. большое спасибо за вашу помощь до сих пор - person Abiodun; 14.11.2014
comment
Спасибо, erandac.. я нашел способ с вашей концепцией - person Abiodun; 15.11.2014