如何初始化angular.js控制器数据内联"右"办法

时间:2014-07-29 02:50:00

标签: javascript angularjs

我知道如何使用http请求中的承诺执行此操作,但在这种情况下,必须从内联脚本初始化数据。

此控制器已在标头js中定义:

var testModule = angular.module('myTestModule', []);
testModule.controller('testCtrl', function ($scope) {
    $scope.data = [];
});

以下html加载,为了论证,让我们说完成脚本部分需要很长时间:

<div ng-app="myTestModule" ng-controller="testCtrl">
...
</div>
<script type="text/javascript">
    setInitialData(['boo', 'far']);
</script>

如果在使用ng-app的div之前加载了内联脚本,我就不会遇到问题,但在这种情况下,它可能会在实例化控制器后加载。我试图避免额外的http请求,尽管通过角度服务使用promise非常方便。

有没有人对如何构造函数setInitialData有任何想法,以便将数据应用于控制器/范围?

1 个答案:

答案 0 :(得分:1)

您可以使用angular.element(...).scope()方法获取对任何DOM元素的范围的引用(protip:在devtools JS控制台中使用angular.element($0).scope()以获取Elements中当前所选元素的范围标签)。

从那里,您可以根据需要更改范围。请务必致电$apply()以使AngularJS了解更改。

e.g。

<div ng-app="myTestModule" ng-controller="testCtrl" id="testCtrl">
...
</div>
<script type="text/javascript">
    function setScopeValue(selector, scopeProp, value) {
        angular.element(selector).scope().$apply(function ($scope) {
            $scope[scopeProp] = value;
        });
    }

    function setInitialData(data) {
        setScopeValue('#testCtrl', 'data', data);
    }

    setInitialData(['boo', 'far']);
</script>

请注意,我的setScopeValue()函数仅适用于单个级别的属性访问,因此不支持点。如果您需要设置嵌套属性,则可以使用$parse()创建一个可以使用$scope调用的setter函数和要设置的值。