Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS承诺不会正确设置“this”_Angularjs_Json - Fatal编程技术网

AngularJS承诺不会正确设置“this”

AngularJS承诺不会正确设置“this”,angularjs,json,Angularjs,Json,我试图用JSON文件中的数据预填充一个选择列表 控制器 当我与检查器一起查看控制台时,会显示数据。但是,下面的代码生成一个空JSON,{} HTML 如果我将控制器第1行中的this.langs=[]设置为this.langs=[one],则模板会正确反映更改,如[langs:[one]] 编辑 这个问题类似于,但是这个问题以简洁的方式解决了在AngularJS上下文中使用This的一个常见陷阱。您应该将This的外部存储在一个变量中,比如var=This,而resolve handler的内部

我试图用JSON文件中的数据预填充一个选择列表

控制器

当我与检查器一起查看控制台时,会显示数据。但是,下面的代码生成一个空JSON,{}

HTML

如果我将控制器第1行中的this.langs=[]设置为this.langs=[one],则模板会正确反映更改,如[langs:[one]]

编辑
这个问题类似于,但是这个问题以简洁的方式解决了在AngularJS上下文中使用This的一个常见陷阱。

您应该将This的外部存储在一个变量中,比如var=This,而resolve handler的内部使用This.langs=payload.data


希望有帮助

好吧,我想你的问题是函数中的这个与函数外的不一样。您可以将外部变量设置为一个变量,这样您就可以使用该变量来访问您的langs,即使在回调函数中也是如此

this.langs = [];

var base = this;

var promise = $lcidFactory.getLCIDS();
promise.then(
    function(payload){
        base.langs = payload.data;
        console.log(payload.data);
    },
    function(error){
        alert("[Error] "+error);
    }
);
promise.then(
    function(payload){
        this.langs = payload.data;
    }.bind(this),
    ...
我建议,javascript中的this有点奇怪,或者与其他语言和范围相关的东西有所不同

对于您的代码:

this.langs = [];
var promise = $lcidFactory.getLCIDS();
promise.then(
    function(payload){
        this.langs = payload.data;
        console.log(payload.data);
    }.bind(this), 
    function(error){
        alert("[Error] "+error);
    }
);

另一种解决方案是将上下文绑定到提供有界函数的函数

this.langs = [];

var base = this;

var promise = $lcidFactory.getLCIDS();
promise.then(
    function(payload){
        base.langs = payload.data;
        console.log(payload.data);
    },
    function(error){
        alert("[Error] "+error);
    }
);
promise.then(
    function(payload){
        this.langs = payload.data;
    }.bind(this),
    ...
这是回调函数中处于松散模式的窗口或处于严格模式的未定义窗口。这可以通过以下方式解决:

使用ES5绑定可以代替传统浏览器

promise.then(
    (payload) => {
        this.langs = payload.data;
    },
    ...
使用ES6箭头函数

将其分配给父函数范围中的另一个变量


可能是真棒的复制品,就是这样!愚蠢的错误!谢谢
promise.then(
    (payload) => {
        this.langs = payload.data;
    },
    ...
var _this = this;

promise.then(
    function(payload){
        _this.langs = payload.data;
    },
    ...