2016-01-27 28 views
0

我有一個非常簡單的預加載屏幕腳本,我需要從幾個控制器中獲取。然而,我不能讓它自動更新變量,我不知道我做錯了什麼。如何監視我廠的變量變化

廠:

myApp.factory("preloader", function(){ 

    var preload = {}; 

    preload.loaded = true; 

    preload.turnOn = function() { 
     preload.loaded = true; 
     console.log('on'); 
    } 

    preload.turnOff = function() { 
     preload.loaded = false; 
     console.log('off'); 
    } 

    preload.getState = function() { 
     return preload.loaded; 
    } 


    return preload; 

}); 

控制器

mazda.controller('preloadingHome', ['$scope', "preloader", function($scope, preload) { 
    $scope.users  = false; 
    $scope.showPreload = preload.getState(); 
    console.log(preload.loaded); 

    $scope.turnOn = function(){ 
     preload.turnOn(); 
    } 

    $scope.turnOff = function(){ 
     preload.turnOff(); 
    } 
    // 
    // $scope.state = preload.state; 
    // preload.turnOff(); 

}]); 

查看

<body data-ng-controller="preloadingHome"> 
    <div>aaa: {{ showPreload }}</div> 
    <div>b: {{users}} </div> 

    <input type="checkbox" ng-model="users" /> 
    <input type="checkbox" ng-change="turnOff()" ng-model="pene" /> 
    <input type="checkbox" ng-change="turnOn()" ng-model="pene2" /> 
    <!-- script src="js/scripts.min.js"></script --> 
    <script src="js/scripts.min.js"></script> 
    <script src="js/bundle.js"></script> 
</body> 

我的問題是:在{{SH無論我如何改變,視圖中的owPreload}}變量加載總是保持爲真。

回答

2

我認爲指出這一點不起作用的原因很重要,因爲您的getState()方法按值返回,而不是通過引用返回。

當您的控制器實例化時,它將showPreloaded變量設置爲preloaded.loaded對象成員的值,即true。每次更改狀態後,都會正確更新工廠中的對象成員,但$scope.showPreloaded值等於true,因爲它不是在工廠中引用該值。

這裏是如何改變你的代碼:

在視圖

<div>aaa: {{ showPreload.loaded }}</div> 

在工廠:

preload.getState = function() { 
    return preload; 
} 

工廠現在將返回參照對象預緊力。JavaScript的總是返回一個對象的時候返回引用,並返回原始

+0

我見過這個問題的最佳解釋 - 非常感謝 – danday74

1

你的工廠的方法不是一個雙向綁定,而是暴露從您的工廠/服務的變量,並綁定到,例如

factory.state = { isTurnedOn : true }; 

您可以直接綁定到該工廠的變量,或讓你的控制器自己的變量鏈接到工廠變量

1

返回整個對象而不是返回一個原語。沒有原語

的繼承在工廠

preload.getState = function() { 
    return preload; 
} 

在控制器

$scope.preloadState = preload.getState(); 

鑑於

<div>aaa: {{ preloadState.preload ?'Yes':'No'}}</div> 

現在角視圖觀察者將檢測對象和更新的屬性改變查看

0

時,你應該嘗試寫這篇返回值:scope.preload = preloader;

然後你可以操縱你的對象scope.preload。