Javascript 如何将变量分配给函数中的别名控制器?
(免责声明:我真的不知道这个问题是否符合“问题”的Stackoverflow定义,因为我已经(不止)有一个解决方案,我只是不喜欢我找到的解决方案。如果是这样,我提前道歉,并欢迎其他选择。) 我正在创建一个Angularjs指令,我想使用Javascript 如何将变量分配给函数中的别名控制器?,javascript,angularjs,Javascript,Angularjs,(免责声明:我真的不知道这个问题是否符合“问题”的Stackoverflow定义,因为我已经(不止)有一个解决方案,我只是不喜欢我找到的解决方案。如果是这样,我提前道歉,并欢迎其他选择。) 我正在创建一个Angularjs指令,我想使用控制器作为ctrl语法,这样我就可以在HTML中使用ctrl.property,而不是一个非上下文的、可能带有阴影的属性 但是,这意味着,在控制器函数上,HTML中要访问的变量需要绑定到this。例如: angular.module('GreetingM
控制器作为ctrl
语法,这样我就可以在HTML中使用ctrl.property
,而不是一个非上下文的、可能带有阴影的属性
但是,这意味着,在控制器函数上,HTML中要访问的变量需要绑定到this
。例如:
angular.module('GreetingModule')。指令('greetings',function(){
“严格使用;”
返回{
限制:'E',
templateUrl:'greetings.html',
控制器:函数(){
this.hellives=['Hello','Hola','sallt'];
},
主控制器
}
});
我很同意。但是当我开始使用函数的时候,事情就不一样了
假设我需要从服务加载问候语
angular.module('GreetingModule')。指令('greetings',
['langService',函数(langService){
“严格使用;”
返回{
限制:'E',
templateUrl:'greetings.html',
控制器:函数(){
this.hellives=[];
函数语言loaded(langs){
对于(变量i=0;i
这将失败。在回调时,当调用languagesLoaded
时,this
未绑定,函数将抛出错误,this.hellives未定义
我找到了三种方法来解决这个问题,但我不喜欢这三种方法(我真的没有任何技术上的理由不喜欢它们,它们只是感觉不对,好像我在尝试做我不应该做的事情):
创建一个指向此
的变量,并在函数中使用该变量:
var self=this;
// ...
self.greetings.push(langs[i].greeting);
将对象参数中的此
传递到langService.load()
:
指令中的/**/
langService.load({
目标:这个,,
callback:languagesLoaded
})
/*在职*/
函数加载(配置){
//加载语言,然后:
config.languagesLoaded.call(目标语言);
}
将数组绑定到此
和函数作用域,以便更改作用域变量也会影响此
变量(因为它们引用相同的数组):
var greetings=this.greetings=[];
// ...
问候语.push(langs[i].问候语);
还有别的办法吗?假设没有,以上哪种解决方案最正确?您的方法#1似乎是最好的。使用此
时应小心,因为它会根据上下文(例如,在函数中)更改其含义。如果您使用的是第三方库,有时您甚至不知道这一点
我觉得这很有用。从指南中:
function Customer() {
var vm = this;
vm.name = {};
vm.sendMessage = function() { };
}
您可以将函数的this
绑定到控制器:
langService.load({
callback: languagesLoaded.bind(this)
});
对于IE<9,需要使用polyfill,因为从ECMAScript 5开始,bind
就可以使用了。这实际上看起来好多了,谢谢。我要等一会儿,看看有没有人还有什么要说/补充的。如果没有,我会接受你的回答。我知道这是旧的,但我还是会写下来作为参考。角度特性Angular.bind
,与ad ES5的功能相同,但也适用于较旧的浏览器。@link Good catch。我不知道这个功能。唉,Angular本身从1.3开始就不能在旧浏览器上运行。