2016-05-08 11 views
0

Ich habe diese Variable, die von der Factory gesteuert wird und den Controller zu aktualisieren, aber es ist nicht passiert.AngularJS - Steuerungsvariable, die nicht von einer Servicefunktion aktualisiert

Hier ist, was ich habe:

var app = angular.module('plunker', []); 

app.controller('AppController', function($scope, AppFactory) { 
    var vm = this; 

    $scope.serverStatus = AppFactory.getStatus(); 
}); 

app.factory('AppFactory', function($timeout) { 

    var AppFactory = {}; 
    var vm = this; 
    vm.serverStatus = true; 

    // Execute after 2 seconds of page start 
    $timeout(function() { 
    AppFactory.setStatus(false); 
    }, 2000); 

    AppFactory.setStatus = function(status) { 
    console.log('Server set to ' + status); 
    vm.serverStatus = status; 

    // Getting server status = false 
    AppFactory.getStatus(); 
    }; 


    AppFactory.getStatus = function() { 
    console.log('Getting server status: ' + vm.serverStatus); 
    return vm.serverStatus; 
    }; 

    return AppFactory; 
}); 

LIVE-Plunker DEMO: https://plnkr.co/edit/62xGw7Klvbywp9TODWF4?p=preview

Glauben Sie, die Richtlinien besser zwischen einer Fabrik und Controller mit 2-Wege-Kommunikation funktionieren würde?

+0

Übertragung durch Ereignisse, wenn Server-Status ein EventEmitter Service changes.Make, und wenn Statusänderungen den Wert ausgeben, subskribieren Sie im Controller, um den letzten Wert durch dieses Ereignis zu erhalten. Wenn Sie weitere Hilfe benötigen, gebe ich möglicherweise einen Code-Hinweis. – Bettimms

Antwort

1

prüfen diese bearbeitet die plunkr https://plnkr.co/edit/z6tdr5?p=preview

var app = angular.module('plunker', []); 

app.controller('AppController', function($scope,$timeout, AppFactory) { 
    var vm = this; 

    $timeout(function() { 
    AppFactory.setStatus(false); 
    $scope.serverStatus = AppFactory.getStatus(); 
    }, 2000); 

    $scope.serverStatus = AppFactory.getStatus(); 
}); 

app.factory('AppFactory', function($timeout) { 

    var AppFactory = {}; 

    var serverStatus = true; 

    // Execute after 2 seconds of page start 


    return { 
     getStatus: function() { 

      //console.log('Getting server status: ' + vm.serverStatus); 
      return serverStatus; 
     }, 
     setStatus : function(status) { 
      var vm = this; 
     console.log('Server set to ' + status); 
     serverStatus = status; 

     // Getting server status = false 
     vm.getStatus(); 
    } 
    }; 
}); 
+0

Direktiven wäre eine bessere Option, wenn Sie DOM häufig und mit komplexen Struktur/Daten manipulieren müssen ** EDIT ** Bitte beachten Sie, wie die Service-Funktionen geschrieben werden. hoffe, es hilft –

+0

Ich würde wollen, dass der Timeout-Anruf aus der Fabrik statt der Controller – nn2

+0

@ nn2 Warum brauchen Sie Timeout im Dienst jeden bestimmten Grund? weil das Timeout vom Controller auch beim Laden der Seite ausgelöst wird. Möchtest du es im Dienst auslösen? oder einfach Timeout-Funktion im Dienst halten? Sie können Timeout jederzeit vom Controller auslösen, wenn Sie es in Service-Funktion setzen. Optional, wenn Sie möchten, dass es bei jedem HTML-Div-Load ausgelöst wird, können Sie das mit ng-init tun. Ich kann das Beispiel ändern, was Sie wollen –

0

Hier ist eine Lösung, die Ereignisse verwendet, zum Beispiel:

app.controller('AppController', function($scope, AppFactory) { 
    var vm = this; 

    $scope.$on('messageOne', function(event, data){ 
    console.log(data); 
     $scope.serverStatus = data; 
     $scope.$apply(); //I think $apply() is not needed here! 
    }); 

    $scope.serverStatus = AppFactory.getStatus(); 


}); 

app.factory('AppFactory', function($timeout, $rootScope) { 

    var AppFactory = {}; 
    var vm = this; 
    vm.serverStatus = true; 

    // Execute after 2 seconds of page start 
    $timeout(function() { 
    AppFactory.setStatus(false); 
    }, 2000); 

    AppFactory.setStatus = function(status) { 
    console.log('Server set to ' + status); 
    vm.serverStatus = status; 

    // Getting server status = false 
    //AppFactory.getStatus(); 

    $rootScope.$broadcast('messageOne', status); 
    }; 


    AppFactory.getStatus = function() { 
    console.log('Getting server status: ' + vm.serverStatus); 
    return vm.serverStatus; 
    }; 

    return AppFactory; 
}); 

https://plnkr.co/edit/pARMnE3Wl0OeJezKuvLT?p=info

Verwandte Themen