Javascript 如何将变量分配给函数中的别名控制器?

Javascript 如何将变量分配给函数中的别名控制器?,javascript,angularjs,Javascript,Angularjs,(免责声明:我真的不知道这个问题是否符合“问题”的Stackoverflow定义,因为我已经(不止)有一个解决方案,我只是不喜欢我找到的解决方案。如果是这样,我提前道歉,并欢迎其他选择。) 我正在创建一个Angularjs指令,我想使用控制器作为ctrl语法,这样我就可以在HTML中使用ctrl.property,而不是一个非上下文的、可能带有阴影的属性 但是,这意味着,在控制器函数上,HTML中要访问的变量需要绑定到this。例如: angular.module('GreetingM

(免责声明:我真的不知道这个问题是否符合“问题”的Stackoverflow定义,因为我已经(不止)有一个解决方案,我只是不喜欢我找到的解决方案。如果是这样,我提前道歉,并欢迎其他选择。)

我正在创建一个Angularjs指令,我想使用
控制器作为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开始就不能在旧浏览器上运行。