Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何初始化angular.js控制器数据内联;对",;方式_Javascript_Angularjs - Fatal编程技术网

Javascript 如何初始化angular.js控制器数据内联;对",;方式

Javascript 如何初始化angular.js控制器数据内联;对",;方式,javascript,angularjs,Javascript,Angularjs,我知道如何通过http请求上的承诺来实现这一点,但在这种情况下,必须从内联脚本初始化数据 此控制器已在标头js中定义: var testModule = angular.module('myTestModule', []); testModule.controller('testCtrl', function ($scope) { $scope.data = []; }); 以下html加载,为了便于讨论,假设完成脚本部分需要很长时间: <div ng-app="myTestMo

我知道如何通过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>

...
setInitialData(['boo','far']);
如果内联脚本是在div with ng应用程序之前加载的,我不会有问题,但在这种情况下,它可能会在控制器实例化之后加载。我试图避免一个额外的http请求,尽管使用promise和angular服务很方便


有人知道如何构造函数setInitialData以便将数据应用于控制器/作用域吗?

您可以使用
angular.element(…).scope()
方法获取对任何DOM元素作用域的引用(protip:use
angular.element($0.scope())
在devtools JS控制台中,在“元素”选项卡中获取当前选定元素的范围)

从那里,您可以根据需要对范围进行更改。确保调用
$apply()
,使AngularJS意识到更改

e、 g


...
函数setScopeValue(选择器、scopeProp、值){
angular.element(选择器).scope().$apply(函数($scope){
$scope[scopeProp]=值;
});
}
函数setInitialData(数据){
setScopeValue(“#testCtrl”、“数据”、“数据”);
}
setInitialData(['boo','far']);

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

如您所述,使用“正确”的方法,正如您已经提到的,当数据可用于应用程序时,在满足第一个请求时发出两个请求似乎是浪费。我意识到问题在于如何让内联脚本工作,但为什么?您是否考虑过从控制器或应用程序的运行块内部调用setInitializedData?这与自定义框架限制有关。Javascript被放在主体之外的一个单独的内容块中。感谢您的快速帮助。有一个警告;jqLite不能与“#testCtrl”选择器一起使用。最后我使用了angular.element(document.getElementById(id))
<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>