在AngularJS中使用ng-change和“Controller As”语法
Using ng-change in AngularJS with "Controller As" syntax
我试图避免在我的控制器函数中使用$scope,而是选择使用
var viewModel = this;
使用"控制器作为"视图模型语法。我的问题是我需要使用 ng-change 来调用控制器中的函数,但是虽然我能够从服务访问数据,但我无法调用函数。
//Controller
(function () {
'use strict';
angular
.module('app')
.controller('GeneralSettingsController', GeneralSettingsController);
GeneralSettingsController.$inject = ['SimulationService'];
function GeneralSettingsController(SimulationService) {
var viewModel = this;
viewModel.SimulationService = SimulationService;
viewModel.setSimulationPeriod = setSimulationPeriod;
function setSimulationPeriod() {
console.log("Entered local setSimulationPeriod");
viewModel.SimulationService.setSimulationPeriod();
}
}
})();
控制器在定义控制器和控制器的指令中实例化为:"viewModel"
我的 html 看起来像这样:
<div class="col-xs-2">
<input type="text" class="form-control" id="startyear" name="startyear" placeholder="start year"
autocomplete="off" value="2017" maxlength="4"
ng-model="viewModel.SimulationService.data.simulationPeriodStart" ng-change="viewModel.setSimulationPeriod">
</div>
当我使用$scope而不是引用控制器时,我能够称事情很好,但我觉得这并不理想。我希望有一种方法可以调用仍然使用 viewModel 的 ng-change 函数。
角度表达式
您没有调用该函数。相反,请尝试:
<input ng-change="viewModel.setSimulationPeriod()">
请注意函数末尾的 ()。 Ng-change,像大多数其他角度指令一样使用表达式,这意味着它们实际上是在尝试执行JavaScript的一个子集。在这种情况下,当你刚刚传递对 vm 函数的引用时,它只是对其进行评估,而不是执行它。
分配顺序
此外,在定义要设置的函数之前,您已经定义了 viewModel 函数。将函数声明移到代码中将其分配给视图模型的部分上方。
而不是这个
viewModel.setSimulationPeriod = setSimulationPeriod;
function setSimulationPeriod() {
console.log("Entered local setSimulationPeriod");
viewModel.SimulationService.setSimulationPeriod();
}
像这样重新排序
function setSimulationPeriod() {
console.log("Entered local setSimulationPeriod");
viewModel.SimulationService.setSimulationPeriod();
}
viewModel.setSimulationPeriod = setSimulationPeriod;
Jusopi是对的。我的控制器未正确连接。问题是我在更高的范围内激活了另一个控制器,该控制器也设置为控制器As:viewModel。这导致我在函数不存在的情况下引用了错误的控制器。一旦我给这个控制器一个独特的名称,一切都很顺利,这就是它适用于$scope的原因。
相关文章:
- 在MVC 4中,对Controller的Ajax调用为空
- 调用laravel{{action(Controller@method}}通过传递vue.js数组中的变量
- jQuery .load with variable as url
- 基于用户加载不同的controller/js文件'访问级别
- React.findDOMNode comes as undefined
- Reveal Modal中带有Foundation-Controller的AngularJS不起作用
- 如何为通过ng-view指令或ng-controller指令创建的每个新作用域设置侦听器
- $scope is coming as undefined
- RequireJS正在加载angular应用程序,但没有't创建app.controller
- 打印从Spring MVC Controller发送的字符串数组只显示“;toJSON”;在javascript中
- 如何根据Angularjs中的某些条件在Controller中生成scoped变量
- 为什么我发布的数据在这个AJAX调用的Controller目标中为null
- Codeigniter controller, javascript console.log()
- AltGr treated as Alt + Ctrl
- 在AngularJS中使用ng-change和“Controller As”语法
- 我可以使用Typescript类作为AngularJS控制器使用新的'controller as'语法
- 如何在提交后使用Controller As语法重置表单
- 控制器之间的通信使用"Controller as"语法
- 使用controller as访问属性指令值
- AngularJS控制器初始化问题,当从$scope切换到"controller as"的形式