如何将变量分配给函数内的别名控制器
How to assign variables to an aliased Controller inside a function?
(免责声明:我真的不知道这个问题是否符合"问题"的Stackoverflow定义,因为我已经有了(不止)一个解决方案,我只是不喜欢我找到的解决方案。如果碰巧发生这种情况,我提前道歉,并欢迎其他选择。)
我正在创建一个Angularjs指令,我想使用Controller as ctrl
语法,这样我就可以在HTML中使用ctrl.property
,而不是非上下文的、可能有阴影的property
。
然而,这意味着,在Controller函数上,要在HTML中访问的变量需要绑定到this
。例如:
<!-- HTML file: greetings.html -->
<ul>
<li ng-repeat="item in main.items track by $index" ng-bind="item"></li>
</ul>
angular.module('GreetingModule').directive('greetings', function() {
'use strict;'
return {
restrict: 'E',
templateUrl: 'greetings.html',
controller: function () {
this.greetings = ['Hello', 'Hola', 'Salut'];
},
controllerAs: main
}
});
我对此很满意。但当我开始使用函数时,事情就分崩离析了。
假设我需要加载服务中的问候语。
angular.module('GreetingModule').directive('greetings',
['langService', function(langService) {
'use strict;'
return {
restrict: 'E',
templateUrl: 'greetings.html',
controller: function () {
this.greetings = [];
function languagesLoaded(langs) {
for (var i = 0; i < langs.length; i++) {
this.greetings.push(langs[i].greeting);
}
}
langService.load({
callback: languagesLoaded
});
},
controllerAs: 'main'
};
}]);
这将失败。回调时,调用languagesLoaded
时,this
未绑定,函数将抛出错误this.greetings is undefined
。
我已经找到了三种方法来解决这个问题,但我不喜欢这三种方法(我真的没有任何技术上的理由不喜欢它们,它们只是觉得错了,就像我试图做一些我不应该做的事情):
- 创建一个指向
this
的变量,并在函数中使用该变量:
var self = this;
// ...
self.greetings.push(langs[i].greeting);
- 将对象参数中的
this
传递给langService.load()
:
/* In the directive */
langService.load({
target: this,
callback: languagesLoaded
})
/* In the service */
function load(config) {
// load languages, then:
config.languagesLoaded.call(target, languages);
}
- 将数组绑定到
this
和函数作用域,以便更改作用域变量也会影响this
变量(因为它们引用相同的数组):
var greetings = this.greetings = [];
// ...
greetings.push(langs[i].greeting);
还有别的办法吗?假设没有,以上哪种解决方案最正确?
您可以将函数的this
绑定到控制器:
langService.load({
callback: languagesLoaded.bind(this)
});
对于IE<9将需要polyfill,因为CCD_。
您的方法#1似乎是最好的。使用this
时应该小心,因为它会根据上下文更改其含义,例如,就像在函数中一样。如果你使用的是第三方图书馆,有时你甚至不会知道这一点。
我觉得这本指南很有用。来自指南:
function Customer() {
var vm = this;
vm.name = {};
vm.sendMessage = function() { };
}
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 从控制器返回后Ajax启动事件激发
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 如何在单击复选框后调用控制器方法
- 在控制器和数据对象之间同步数据
- 将Javascript数组发送到控制器ASP.NET MVC
- 角度控制器结构
- 如何在Jquery中发布后将值从视图返回到控制器
- 将值从html传递到AngularJS控制器
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 从控制器继承了隔离的作用域以生成可重用的指令
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 为什么不't我的变量在我的控制器中填充后在我的视图中呈现
- Nodejs API控制器,用于在API之间切换
- 如何在Angular单元测试中从另一个控制器的rootScope将方法添加到rootScope中
- 为什么我的“ng-click”和“ng-show”需要我传递控制器别名以及正在传递的函数
- 如何将变量分配给函数内的别名控制器
- ExtJS控制器引用视图获胜'不要使用不同的别名
- 当我使用别名时,AngularJS中的控制器继承不起作用