将 Angular 范围变量传递给 Javascript

IT技术 javascript angularjs
2021-01-15 18:11:06

我有一个 Angular 范围变量 streetName。

<script type="text/javascript">
    angular.module('addApp').controller('add', ['$scope',function($scope) {
           $scope.streetName = "Bonita Ln";
    }]);
</script>

如何在此控制器(添加)范围下定义的 javascript 中访问 streetName。请帮忙。

<div ng-app="addApp" ng-controller="add">
StreetName: {{streetName}}

<script type="text/javascript">
//here i need to access the value of streetName...
</script>

</div>
5个回答

这条路很长,但它有效:

    angular.element(document.querySelector('[ng-controller="add"]')).scope().streetName

更具可读性:

    var dom_el = document.querySelector('[ng-controller="add"]');
    var ng_el = angular.element(dom_el);
    var ng_el_scope = ng_el.scope();
    var street_name = ng_el_scope.streetName;

如果您使用 jQuery,它会更短:

    var street_name = $('[ng-controller="add"]').scope().streetName;

链接到jsfiddle 演示

但这是返回空值。它无法读取控制器“添加”。
2021-03-19 18:11:06
@chrmiv 我发现了这个问题......我没有在环绕 javascript 标签的 div 标签中包含 ng-controller .. 现在它完美地工作了。太感谢了..
2021-03-30 18:11:06
它的工作:) 但有时它给空。看看我错过了什么..非常感谢..!!
2021-04-03 18:11:06
@JPN 如果null您可以添加一些setInterval检查元素/范围的小东西,直到它完全准备好。祝你好运!
2021-04-08 18:11:06
@JPN 似乎元素还没有准备好。尝试将我的代码放在window.onload处理程序中
2021-04-13 18:11:06

您可以使用$window服务将范围增值税传递给常见的 js var

像这样:

angular.module('addApp', [])
.controller('add', ['$window', function ($window) {
    ...
    $window.streetName = $scope.streetName; 
    ...
}

然后将您的 js 附加到像这样的通用 js 代码中:

<script type="text/javascript">
    document.write("\<script src='...' type='text/javascript'>\<\/script>");
</script>

但请记住,这是解决方法,而不是最佳解决方案

@Sergey Panfilov:但是我如何在 myscript 值中访问该值。?
2021-03-18 18:11:06
太棒了!以防万一它不清楚,您可以使用javascript window 对象访问分配给angular $window 对象的值。
2021-04-06 18:11:06

我遇到了类似的问题。我找到了解决办法。它对我来说效果很好,但不确定这是否是正确的方法。

在 html 中创建一个隐藏的输入字段,并从 angular 分配您的值。在 javascript 中访问此值。确保在脚本标记之前创建它,以便在到达脚本标记时将其初始化。

像这样的东西:

<div ng-app="addApp" ng-controller="add">
    StreetName: {{streetName}}
    <input type="hidden" id="dummyStreetName" value={{streetName}}>
    <script type="text/javascript">
        console.log("I got the street name "+$("#dummyStreetName").val());
    </script>
</div>
不工作,我在控制台中看到“我得到了街道名称 {{name}}”
2021-03-23 18:11:06

简单、不复杂的 jQuery 解决方案:

HTML

<div id="data" data-street="{{streetName}}"></div>

Javascript

$(document).ready(function() {
    var streetName = $('#data').data('street');
});  

$(document).ready...给予角的时间来设定的变量是很重要的。

在 Angular 11 / typescript 4.3.2 中,我可以通过将它添加到我的 ngOnInit 来做到这一点:

window.localStorage.setItem("roundChartEdges","false")

然后可以访问我覆盖的 javascript chartsjs draw 函数中的变量:

Chart['elements'].Rectangle.prototype.draw = function () {
  console.log(window.localStorage.getItem("roundChartEdges"))
  ...
}

如果您不存储敏感数据,这不是一个糟糕的解决方案

我需要使用在我的 ngOnInit 函数中定义的变量以编程方式告诉 chartsjs 何时圆整条形图边缘,何时不圆。