2016-03-01 51 views
0

我开始使用AngularJS框架,事实是我需要在不同视图中的相同范围,并且,据我所知,控制器中的所有范围都在每个视图中重新初始化。Angular:问题与范围/出厂值

我阅读了一些手册,并通过使用“工厂”发现了一个解决方案,它们允许您在不同的视图中保存数据。不过,我可能是不正确的方式使用的工厂,因为控制器功能后,我需要一个新的观点和价值有没有改变?

我app.js文件:

// Ionic Starter App 

// angular.module is a global place for creating, registering and retrieving Angular modules 
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html) 
// the 2nd parameter is an array of 'requires' 
// 'starter.services' is found in services.js 
// 'starter.controllers' is found in controllers.js 
var valid_numbers = ["2222","7777","8888","9999"]; 

qrApp = angular.module('starter', ['ionic', 'starter.controllers', 'starter.services','ngCordova']) 

.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
     cordova.plugins.Keyboard.disableScroll(true); 

    } 
    if (window.StatusBar) { 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 
}) 

.factory("Scannresult", function(){ 

    var interfaz= { 
    data: "Not information" 
    }; 
    return interfaz; 
}) 

    .controller("qrController", function($scope, $cordovaBarcodeScanner, Scannresult) { 
    document.addEventListener("deviceready", function() { 
    $scope.result=Scannresult.data; 
    $scope.scanBarcode = function() { 
     $cordovaBarcodeScanner.scan().then(successCallback, errorCallback); 
     }}); 

    errorCallback = function (error) { 
    alert("An error happened -> " + error); 
    }; 
    successCallback= function(imageData){ 
       $scope.result=Scannresult.data; 

     var index = valid_numbers.indexOf(imageData.text); //chequea si el numero encontrado es valido 
     if (index >= 0) { 
     alert("El código " + imageData.text + " es valido! :D"); 
     alert("Factory = " + Scannresult.data); 
     Scannresult.data = imageData.text; 
     $scope.result=Scannresult.data; 

     alert("1 El Scope es " + Scannresult.data); 
     alert("2 El Scope es " + $scope.result); 
     $scope.$apply(); 
       alert("2.1 El Scope es " + $scope.result); 

     if (imageData.cancelled) alert("Volve a internarlo!"); 
     else 
      window.location = "Scannresult.html"; 
     } else { 
     alert("El código encontrado no es valido: " + imageData.text); 
     } 
    } 
}); 

在这段代码中,我需要的是扫描后,$scope.result的值显示在Scannresult.html中,但在该文件中,范围具有初始值。

Scannresult.html

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> 
    <title>Resultado</title> 

    <link href="lib/ionic/css/ionic.css" rel="stylesheet"> 
    <link href="css/style.css" rel="stylesheet"> 
    <script src="lib/ionic/js/ionic.bundle.js"></script> 
    <script src="js/ng-cordova.min.js"></script> 
    <script src="cordova.js"></script> 

    <!-- your app's js --> 
    <script src="js/app.js"></script> 
    <script src="js/controllers.js"></script> 
    <script src="js/services.js"></script> 
    </head> 

    <body ng-app="starter"> 
    <div ng-controller="qrController"> 
    <div class="list card"> 
    <div class="item item-avatar"> 
    <h2>Información del código</h2> 
    <h2> escaneado</h2> 
    <p>Aula: {{ result }}</p> 
    </div> 

    <div class="item item-image"> 
    <img src="img/aula.png"> 
    </div> 

    <a class="item item-icon-left assertive" ng-click="scanBarcode()" href="#"> 
    <i class="icon ion-music-note"></i> 
Volver a escanear </a> 

</div> </div> 
</body> 
</html> 

回答

0

可以使用的工厂,然后依赖注入他们进入你的控制器,这可以让你解决一个共享的情况下,你可以用在许多控制器工作。

如果您正在寻找一种访问跨多个范围或页面的数据或变量的简单方法,可以小心使用$rootScope

例如,$rootScope.test = true的任务将在您试图解决它的任何控制器上解析true$rootScope.test

但是,请谨慎使用,因为您不希望污染或混乱您的$ rootScope,因为它是任何控制器提及的。

+0

它没有为我工作。我finnaly使用相同的看法,调用该函数。 –