2015-06-24 36 views
1

有沒有一種「很好」的方式將服務器的日期設置爲angularJS應用程序?在AngularJS應用程序中使用服務器日期的方法

比方說,我有一個API途徑得到這個,有點兒/ API /日期,我可以利用角度的服務調用它稱爲dateService:

angular.module('myApp').service('DateService', ['$resource', function ($resource) { 
    return $resource('/api/date', { }, { 
    }); 

}]); 

我需要儘快獲取日期該應用程序啓動,因爲我的HTML文件使用基於該日期的功能來顯示的東西。否則,每次我打電話時都會收到「未定義」錯誤。

在此先感謝

+1

你可以成爲一個動態生成的頁面的日期,例如PHP,然後把它定義爲一個JavaScript變量的角度你的代碼其餘部分被解釋並加載之前。 –

回答

0

你可以做,在app.run

var app = angular.module('myApp',[]); 
app.run(function ($rootScope, $state, DateService) { 

      // call date service and save it in $rootScope 

     }); 
+1

如果在將答案標記爲無用之前,人們可以評論和解釋,那就太好了。 – kumaro

+1

運行塊 - 在創建注入器後執行並用於啓動應用程序。只有實例和常量可以注入運行塊。這是爲了防止在應用程序運行時進一步進行系統配置。 對於主要方法,運行塊是Angular中最接近的東西。運行塊是需要運行以啓動應用程序的代碼。在完成所有服務配置並創建噴油器後執行。 – kumaro

+0

這解決了我的問題。非常感謝!! – lerp90

-1

你得到後,可以將其分配到服務的變量。

angular.module('myApp').service('DateService', ['$resource', function ($resource) { 
    this.date = null; 
    var self = this; 

    $resource('/api/date', { }, { 
    }).then(function(data){ 
     self.date = data.date; 
    }); 
}]); 

然後調用服務以在需要時獲取它。

$scope.date = function() { 
    return DateService.date; 
} 
+0

'self.date = data.date? new Date(data.date):null;' –

+0

他要求在應用程序啓動後立即獲取日期。這是如何回答的? – kumaro

1
  1. 有後端服務器在UTC返回一個時間戳。
  2. 解析時間戳值var date = new Date(serverTimestampValue);
  3. 您現在有一個JS Date對象,可以與Angular Date過濾器一起使用。
+0

這種方法的問題是我的函數在http調用被解析之前被調用,所以當我第一次加載頁面時出現控制檯錯誤。 – lerp90

+0

他意味着放棄服務和api,並讓你的web服務器直接將它放入你的html中(例如php echo)。這與Rob在您的帖子中發表的評論方式相同。 – Icycool

+0

在HTML文件服務器端添加該值,爲其提供一個DOM ID,並在我們的函數運行之前訪問它。 –

1

如果使用ui-router路由,如果你需要顯示任何用戶可以使用UI路由器的resolve屬性之前學習的時間戳。基本上它可以在激活一個狀態之前解決你需要的東西,並且如果你在你的父母狀態中檢索你的服務器時間,你可以確定你的應用程序中的任何事情開始之前你都會有時間戳。下面是一個示例:

angular.module("yourApp").config(["$stateProvider", function ($stateProvider) { 
     $stateProvider 
      .state("topState", { 
       abstract: true, 
       template: "<ui-view></ui-view>", 
       controller: ["$rootScope", "serverTimestamp", function ($rootScope, serverTimestamp) { 
        $rootScope.serverTime = new Date(serverTimestamp); 
        //Do what you need to do with the server time, from now on you will have access to server time from each controller in your app. 
       }], 
       resolve: { 
        serverTimestamp: ["", function (bakkalBrandService) { 
         return yourService.retrieveTimestampFromServer(); 
        }] 
       } 
      }) 
    }]) 
+0

好的答案!是否有可能使用ngRoute? – lerp90

+0

@ lerp90你看看我在app.run中獲取日期的答案嗎?所有需要啓動應用程序的代碼可以進入app.run – kumaro

+0

@ lerp90似乎你可以做到這一點,只需檢查下面的帖子:http://stackoverflow.com/questions/21735221/using-the-ngroute-resolve -parameter與 - 的注入,承諾 – cubbuk

0

您可以通過手動引導而不是自動初始化來延遲angular應用程序的執行。 https://docs.angularjs.org/guide/bootstrap 通過這種方式,您可以執行以下操作來獲取服務器設置,並在角度應用程序啓動時使其可用。

//Define a global settings object. add proper namespace as per your app. 
var myServerConfig = (function() { 
    var settings = { 
     someDefaultSetting: 'someDefaultValue' 
    }; 
    return { 
     init: function (serverSettings) { 
      settings = $.extend(settings, serverSettings); 
     }, 
     settings: settings 
    } 
})(); 

//Define angular wrapper for your global object 
var serverSettings = angular.module('server.settings', []); 

serverSettings.factory('serverSettings', ['$window', function() { 
    return $window.myServerConfig.settings; 
}]); 

//On dom ready get all settings and bootstrap angular app 
$(document).ready(function() { 
    //You will have to show some animation if you are making ajax call 
    //also if errors out handle that scenario 
    //Other option is to render settings from server on page load as mentioned in other answers 
    $.ajax({ 
      type: 'GET', 
      url: '/api/settings', 
      error: function (error) { 
       //show user message that app cannot be loaded 
      }, 
      success: function (setting) { 
        myServerConfig.init(setting); 
        bootStrapMyApp(); 
      } 
     }); 

function bootStrapMyApp() { 
    angular.element(document).ready(function() { 
     angular.bootstrap(document, ['myApp']); 
    }); 
} 
0
angular.module('myApp').service('DateService', ['$resource', function ($resource) { 

    this.date = null; 
    var self = this; 

    $resource('/api/date', { }, { 
    }).then(function(data){ 
     self.date = data.date; 
    }); 
}]); 
相關問題