2013-03-07 133 views
8

我想用一個JSON對象來初始化一個Angular模型,這個對象將被嵌入到一個HTML頁面中。例如:從AngularJS訪問全局變量

<html> 
    <body> 
    <script type="text/javascript" charset="utf-8"> 
     var tags = [{"name": "some json"}]; 
    </script> 
    <ul> 
     <li ng-repeat="tag in tags">{{tag.name}}</li> 
    </ul> 
    </body> 
</html> 

tags現場解決不了的,因爲它是在$scope擡頭。我嘗試訪問我的控制器中的tags字段,如下所示:

function TagList($scope, $rootScope) { 
    $scope.tags = $rootScope.tags; 
} 

但它不起作用。

它只有在將TagList直接包含到HTML頁面並直接將json呈現到此函數中時纔有效。

如何訪問角控制器中單獨的js文件中的tags字段?

回答

11

至少有兩種方式:

  1. 聲明你tags陣列在一個獨立的腳本標籤,在這種情況下,你的tags變量將被綁定到窗口對象。將$ window注入控制器以訪問窗口綁定變量。
  2. ng-init指令中聲明tags數組。

顯示這兩種解決方案:

HTML:

<body> 

    <script type="text/javascript" charset="utf-8"> 
    var tags = [{"name": "some json"}]; 
    </script> 

    <div ng-controller="AppController"> 
    tags: {{tags | json}} 
    <ul> 
     <li ng-repeat="tag in tags">{{tag.name}}</li> 
    </ul> 
    </div> 

    <div> 
    <ul ng-init="tags = [{name: 'some json'}]"> 
     <li ng-repeat="tag in tags">{{tag.name}}</li> 
    </ul> 
    </div> 

</body> 

JS:

app.controller('AppController', 
    [ 
    '$scope', 
    '$window', 
    function($scope, $window) { 
     $scope.tags = $window.tags; 
    } 
    ] 
); 

Plnkr

我強烈反對污染的窗口對象。

+1

是否有任何其他方式來初始化視圖中的變量,而無需在HTML標籤中聲明它?例如,如果在上面的'ng-init'內聲明的'tags'數組是一個非常大的數組,我想在視圖中初始化它(從服務器端代碼前),我可以使用類似'{{tags = [{...}]}}而不是? – GFoley83 2013-04-01 21:32:12

+0

@Stewie第二種方法也存在問題。如果標籤是通過jsonify方法生成的,並且它們包含引號,則所有內容都會制動。 – Hartimer 2013-08-10 01:24:56

+0

我看不到任何比使用$ window for @ GFoley83的用例更好的方法;我有同樣的問題,我發送了一個初始的JSON負載和我想要注入到控制器中的標記,但這對於Angular來說非常困難。我不喜歡污染窗口對象(或者不得不拉入全局變量),但它似乎是最好的方式。 – 2013-10-23 00:52:32