Я пытаюсь предварительно заполнить список выбора данными из файла JSON.
контроллер
this.langs = [];
var promise = $lcidFactory.getLCIDS();
promise.then(
function(payload){
this.langs = payload.data;
console.log(payload.data);
},
function(error){
alert("[Error] "+error);
}
);
Когда я просматриваю консоль с инспектором, появляются данные. Однако следующий код создает пустой JSON, {}
.
HTML
<template-editor-form model="cpCtrl.data">
...
<pre>{{ cpCtrl.langs | json }}</pre>
...
</template-editor-form>
Если я установил this.langs = []
в строке 1 контроллера на this.langs = ["one"]
шаблон правильно отражает изменения, поскольку ["langs": ["one"]]
EDIT Этот вопрос похож на Как работает ключевое слово this? , однако этот вопрос затрагивает одну из общих проблем использования this
в контексте AngularJS в сжатом виде.
Ну, я думаю, ваша проблема в том, что "это" в вашей функции не является тем же "этим" вне функции. Вы можете установить "вне этого" в переменную, чтобы вы могли использовать эту переменную для доступа к вашим языкам даже в функции обратного вызова.
var self = this;
this.langs = [];
var promise = $lcidFactory.getLCIDS();
promise.then(
function(payload){
self.langs = payload.data;
console.log(payload.data);
},
function(error){
alert("[Error] "+error);
}
);
Другим решением может быть привязка контекста к функции, которая обеспечивает ограниченную функцию.
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
window
в свободном режиме или undefined
в строгом режиме в функциях обратного вызова. Это можно исправить
используя bind
ES5 ( angular.bind
может использоваться вместо старых браузеров)
promise.then(
function(payload){
this.langs = payload.data;
}.bind(this),
...
используя функцию стрелки ES6
promise.then(
(payload) => {
this.langs = payload.data;
},
...
присвоение this
переменной другой переменной в области родительской функции
var _this = this;
promise.then(
function(payload){
_this.langs = payload.data;
},
...
Вы должны хранить внешнее this
в переменной, такой как var that = this
, а внутри обработчика разрешений используется.langs that.langs = payload.data
.
Надеюсь, поможет !
this
в JavaScript немного странно (или отличается от другого языка) и область применения, связанные, я предложить https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
для вашего кода:
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);
}
);