2016-07-20 14 views
0

Nun, versuchen, meinen Code zu aktualisieren sowohl .value und .factory zu reinigen zu verwenden und optimieren meine App ... Nun, mein services.js wie folgt aussieht:AngularJS Ionic mit ng-Modell zwischen zwei Controllern

// Définition des données lues par le scan du code barre 
.value("ScanDatas",{ 
    collectedDatas: {} 
}) 

// Service de scan des codes-barre : dépend de scanDatas 
.factory("ScanService", ["ScanDatas", function (ScanDatas) { 
    var scan = {}; 

    scan.scanBarCode = function(){ 
     var scanner = cordova.plugins.barcodeScanner; // Récupère le scanner 

     // Exécute le scan proprement dit 
     scanner.scan(
      function(result){ 
       alert("Lecture du code-barre\n" + 
        "Résultat : " + result.text + "\n" + 
        "Format : " + result.format + "\n" + 
        "Annulation : " + result.cancelled 
       ); 
       ScanDatas.collectedDatas.text = result.text; 
       ScanDatas.collectedDatas.format = result.format; 
       ScanDatas.collectedDatas.annulation = result.cancelled; 

      }, function(error){ 
       ScanDatas.collectedDatas.error = error; 
      } 
     ) 
    } 
    return scan; 
}]) 

bearbeiten mein Controller-Service anrufen und Scan funktioniert gut, wenn ich auf den Button klicken:

.controller("ScanCtrl", ["$scope", "$ionicPopup", "$timeout", "ScanDatas", "ScanService", function ($scope,$ionicPopup,$timeout,ScanDatas,ScanService){ 
    $scope.add = {}; // Initialise l'objet pour la récupération des données 


    $scope.scanBarCode = function(){ 
     var scanResult = ScanService.scanBarCode(); 
     console.log("Données reçues : " + ScanDatas.collectedDatas.text); 
     $scope.add.ean = ScanDatas.collectedDatas.text; 
    } 
}]) 

Aber in der wiew halten die ng-Modell add.ean desesperatly leer ... Nicht sicher zu verstehen wie funktioniert der .value() mit View und Controllern ...

Thx an @Claie

Ich bin ein Anfänger mit AngularJS und Ionic und habe ein Problem mit MVVM. Haben Sie die folgende Ansicht:

<ion-view title="Ajouter" id="page2" class=" "> 
<ion-content padding="true" class="has-header"> 
    <button id="ajouter-button3" class=" button button-positive button-block " ng-controller="ScanCtrl" ng-click="scanBarCode()">Scanner</button> 
    <div class="spacer" style="width: 300px; height: 13px;"></div> 
    <form id="ajouter-form1" class="list "> 
     <label class="item item-select " id="ajouter-select1" name="stockage"> 
      <span class="input-label">Stockage</span> 
      <select id="add-storage-area" class="form-control" required="required" data-ng-options="storageArea.id as storageArea.libelle for storageArea in storageAreas" ng-model="form.storageArea"></select> 
     </label> 

     <label class="item item-input " id="add-ean" name="ean"> 
      <span class="input-label">EAN</span> 
      <input type="text" placeholder="Code EAN" name="add.ean" ng-model="add.ean"> 
     </label> 
... 

Der Regler für die "scanCtrl" ist die folgende:

.controller('ScanCtrl', ['$scope', function ($scope,$ionicPopup,$timeout) { 
    var scanner = cordova.plugins.barcodeScanner; // Récupère le scanner 
    $scope.scanBarCode = function(){ 
     scanner.scan(
      function(result){ 
       alert("Lecture du code-barre\n" + 
        "Résultat : " + result.text + "\n" + 
        "Format : " + result.format + "\n" + 
        "Annulation : " + result.cancelled 
       ); 
       $scope.add.ean = result.text; 
      }, function(error){ 
       //alert("Le scan a échoué : " + error); 
       $ionicPopup.alert({ 
        title: "Erreur", 
        template: "Une erreur est survenue lors de la lecture du code-barre" 
       }).then(function(res){ 
        // Effacer les données du formulaire ? 
       }); 
      } 
     ) 
    } 
}]) 

Und richtig den EAN-Barcode, aber:

$scope.add.ean = result.text; 

Does nicht Arbeit, kein Wert im zugehörigen Eingang ...

Sicher ist es ein Anfängerfehler b ut ...

Thx ...

+0

das Hinzufügen eines Controllers für einen einzelnen Button fühlt sich nicht nach einem sehr effizienten Prozess an; So etwas wird normalerweise besser durch eine Richtlinie gehandhabt. Wenn Sie dies jedoch tun müssen, sollten Sie einen Dienst verwenden, um die Daten zwischen den Controllern gemeinsam zu nutzen. Wenn Sie einen Dienst nicht verwenden können, können Sie als letzten Ausweg '$ parent' verwenden. – Claies

+0

Ja, es scheint eine gute Idee zu sein ... Wird auf diese Weise funktionieren ... Müssen diese Methode in verschiedenen Teilen meiner App verwenden, so denke ich, es ist eine bessere Möglichkeit, einen Dienst zu verwenden –

+0

Hallo @Claies Fabrik verwenden und Wert, um Barcode-Infos zu bekommen ... Aber auch wenn das Lesen des Barcodes gut funktioniert, kann ich immer noch keine Daten in meinem Controller bekommen ... Arbeit auf diese Weise halten, thx ... –

Antwort

0

vielleicht haben Sie $rootScope wollen? $rootScope ist ein globaler Bereich, der Werte zwischen Controllern, Filtern, Direktiven usw. enthalten kann

+0

'$ rootScope' würde funktionieren, aber mit '$ rootScope' ist ein Anti-Pattern, weshalb ich es in meinem Kommentar zu Alternativen nicht empfohlen habe. Ich würde "$ rootScope" unterhalb von "$ parent" im Ranking der Optionen setzen, um das Problem hier zu lösen. – Claies

+0

Verwenden Sie $ rootScope und es funktioniert ... Thx ... Aber versuchen Sie, einen Dienst zu verwenden, um die Scan-Methode in verschiedenen Teilen der App zu verwenden ... –

+0

ja Service ist der beste Weg, dies zu tun – neuronet