当前位置: 首页 > 面试题库 >

如何在范围之外更改AngularJS数据?

都浩淼
2023-03-14
问题内容

经过数小时令人沮丧的搜索,我觉得我需要在这里提交我的问题。如果此问题以前得到过解答,我事先表示歉意,但是到目前为止,我的搜索都没有帮助。所以这是我的问题:

我的JavaScript代码正在创建一个对象,该对象由AngularJS修改和监视。对于某些事件(例如加载对象的先前设置),我希望从范围之外更改该对象的属性。问题是输入不会改变…

这是我希望如何执行这些更改的示例:

HTML代码:

<div ng-app="myApp" ng-controller="FirstCtrl">
<input type="number" ng-model="data.age">
<h1>{{data.age}}</h1>

<input type="button" value="Change to 20" ng-model="data" onclick="change()">

JavaScript代码:

var person = {
    age: 16
};

// Create module
var myApp = angular.module('myApp', []);
myApp.factory('Data', function() {
    return person;
});

function FirstCtrl($scope, Data) {
    $scope.data = Data;
}

function change() {
    person.age = 20;
}

现在,当我按下“更改为20”按钮时,什么也没有发生。如何通过功能修改人的年龄change


问题答案:

Warning️ 警告: 此答案较旧,不能反映最佳实践,并且可能与较新版本的Angular不兼容。

MaxPRafferty的答案是正确的-在范围内使用函数通常是执行此操作的更好方法-
但还有另一种选择。您可以使用该angular.element(...).scope()方法从不相关的JavaScript访问Angular范围。通过定位具有ng- app指定属性的元素来选择应用程序的顶级范围,例如单击处理程序中的内容:

function change() {
    var appElement = document.querySelector('[ng-app=myApp]');
    var $scope = angular.element(appElement).scope();
    $scope.$apply(function() {
        $scope.data.age = 20;
    });
}

在此Fiddle中尝试一下。

刚刚指出Angular在$digest()通话期间将只处理任何“监视”或“绑定”
。如果仅$scope直接修改直接对象的属性,则更改可能不会立即反映出来,并且可能会出现错误。

要触发此操作,您可以调用$scope.$apply()它将检查脏范围并更新正确绑定的任何内容。传递一个在内部起作用的函数$scope.$apply将使Angular也可以捕获任何异常。Scope文档中对此行为进行了说明。



 类似资料:
  • 问题内容: 我需要从指令内的回调中修改根范围属性。但是,该指令位于由switch指令创建的内部范围内。 HTML JavaScript 小提琴:http://jsfiddle.net/nJ7FQ/ 我的目标是能够在“选定区域”中显示“新值”。我该如何完成我想做的事情?我究竟做错了什么? 此外,我正在尝试制作一个组件。有没有办法做到这一点,但要隔离范围? 问题答案: 我更新了小提琴,基本上不得不去父

  • 问题内容: 如何从其父范围调用在子范围中定义的方法? http://jsfiddle.net/wUPdW/ 问题答案: 您可以从父母到孩子使用: 工作jsfiddle:http : //jsfiddle.net/wUPdW/2/ 更新 :还有另一个版本,耦合性更低,更易于测试: jsfiddle:http : //jsfiddle.net/uypo360u/

  • 我的NetCDF文件有4个维度(经度、纬度、时间、水平压力)和几个变量。 我想替换经度数据[340 342 344...360 0 2 4 ...由[-20 -18 -16...-2 0 2 4 ...18 20].事实上经度是从0°到360°计算的,但是我需要从-180°到180°。 我在网上找到了一些想法,但我不知道如何应用它们。 这里有一个解释: “一些netcdf文件包含严格的正值[0,3

  • 问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如

  • 问题内容: 我正在尝试查看是否存在通过外部javascript函数访问控制器内部范围的简单方法(与目标控制器完全无关) 我在其他几个问题上看到 会从DOM元素中检索范围,但是我的尝试目前未产生正确的结果。 这是jsfiddle:http : //jsfiddle.net/sXkjc/5/ 我目前正在经历从纯JS到Angular的过渡。我试图实现这一目标的主要原因是要保持原始库代码尽可能完整。无需我

  • 问题内容: 我将an 绑定到输入,但是绑定到该变量的值未在该指令声明的位置之外进行更新: 选择新日期时,仅内部会更新。外部的那个仍然是旧值(可能取决于我是否在控制器中声明了它,这无关紧要)。 我正在使用angular-materialize,我不确定这是否是问题的根源,但是没有意义,因为这是与CSS框架materializecss一起使用的特定的angular框架。 这是我正在使用的组件。 编辑: