0

I am making an app, the user can either select an item or use their camera to get the qr code which translates into an item's ID.

The problem is that I think some JQuery is messing with my scope from working properly.

I have to get the QR code by listening to an innerHtml change, once it changes (DOMSubtreeModified) the following occurs.

  var index = 0;
  $('#result').one('DOMSubtreeModified', function(e) {
    var code = "";
    if (e.target.innerHTML.length > 0) {
      code = e.target.innerHTML;
      $scope.ToRun(code);
    }
  });

  $scope.ToRun = function(code) {
    for (i = 0; i < $scope.plantList.length; i++) {
      if ($scope.plantList[i].plantcode == code) {
        index = i;
        break;
      }
    }
    $scope.currentPlant = $scope.plantList[index];
    $scope.plantDetails = false;
    $scope.searchDetails = true;
  }

For some reason the following does not have any effect on my ng-classes. As when an item is selected I hide the input dialogs, and show the result one.

$scope.plantDetails = false;
$scope.searchDetails = true;

But when a user selects the item manually it works just perfectly. (the items have an ng-click on it)

  $scope.viewPlant = function(plant) {
    $scope.currentPlant = plant
    $scope.plantDetails = false;
    $scope.searchDetails = true;
  };

And the above works fine, with the ng-click. So why won't my new function that listens for an innerHtml change work?

HTML snippet

<div ng-class="{ 'hidden': searchDetails }">

   <!-- CHOOSE INPUT TYPE -->

   <div class="form-group" style="margin-bottom:0px">
      <div class="btn-group btn-group-justified">
         <div class="btn-group">
            <button type="button" class="btn btn-default" ng-click="digits = false; qr = true">Plant Code</button>
         </div>
         <div class="btn-group">
            <button type="button" class="btn btn-default" ng-click="digits = true; qr = false">QR Code</button>
         </div>
      </div>
   </div>
   <br />

   <!-- QR CODE INPUT -->

   <div ng-class="{ 'hidden': qr }">
      <img id="blah" src="./images/placeholder.png" />
      <span class="btn btn-default btn-file">
      <i class="glyphicon glyphicon-camera"></i>&nbsp;
      <input type="file" onchange="readURL(this);handleFiles(this.files)">
      </span>
      <div id="result">xxxxxx</div>
      <canvas id="qr-canvas" width="800" height="600"></canvas>
   </div>

   <!-- MANUAL SELECTION INPUT -->

   <div ng-class="{ 'hidden': digits }">
      <input ng-model="search.$" style="width:100%; font-size:30px; text-align:center" placeholder="Plant Code" />
      <div style="overflow: auto; max-height:250px">
         <table class="table table-striped" style="background-color:lightblue">
            <tr ng-repeat="plant in plantList | filter:search" ng-click="viewPlant(plant)" style="cursor:pointer">
               <th>{{plant.name}}</th>
               <th>{{plant.plantcode}}</th>
            </tr>
         </table>
      </div>
   </div>
   <div>
   </div>
</div>
<div ng-class="{ 'hidden': plantDetails }">
   // results - this should appear when one of the above is entered.
   //           works for manual selection, but not qr code
</div>

Just confused on why my QR input will not fire off the change-class options to hide the searchDetails div and show the plantDetails div

EDIT: Doing a small test, it seems that my class variables are indeed not updating at all. I just put the values at the bottom of my page and they do not update when hitting the block of:

$scope.plantDetails = false;
$scope.searchDetails = true;
Austin
  • 3,010
  • 23
  • 62
  • 97
  • `$('#result').one` doesn't seem right.... – Rooster Mar 04 '15 at 20:41
  • @Rooster it was `bind`, I tried to use `.one`, to stop firing off multiple events. Both work though as I get all my proper data still. – Austin Mar 04 '15 at 20:42
  • anything that updates scope from outside angular needs to tell angular to run digest ... `$timeout()` or `$apply()` – charlietfl Mar 04 '15 at 20:54
  • Please read this first: http://stackoverflow.com/questions/14994391/thinking-in-angularjs-if-i-have-a-jquery-background – New Dev Mar 04 '15 at 22:13

1 Answers1

0

You need to let Angular know about the change. Add this at the end of your method and let me know if it works.

$scope.$apply();
Gremash
  • 8,158
  • 6
  • 30
  • 44