Собирая список документов с завода на контроллер в AngularJS


С этим контроллером я ввожу myFactory и используя Array.push() чтобы добавить массив response.documents к this.documents массив. Я не могу помочь чувство, что есть лучший способ без использования _this.

function myController($route, myFactory) {
  'ngInject';

  this.$onInit = function() {
    const _this = this;
    const id = $route.current.params.someId;

    this.documents = [];

    myFactory.getData(id).then((response) => {

      console.log(response); // { "something": { "Id":1234 }, "documents":[{ "DocumentId":"2345", "DocumentName":"doc.docx" }] }
      console.log(response.documents); // [{ "DocumentId":"2345", "DocumentName":"doc.docx" }]

      response.documents.forEach((object) => {
        _this.documents.push(object);
      });
    });
  };
}


Комментарии
3 ответа

Указать this контексте

Я поддерживаю Blindman67 ответ. Если стрелка функций не поддерживается всеми браузерами (например, т. е. - Но опять же есть мало поддержки для Угловая в IE во всяком случае), то вы могли бы также использовать функцию.привязать():

this.$onInit = function() {
const id = $route.current.params.someId;

this.documents = [];

myFactory.getData(id).then((response) => {
response.documents.forEach((object) => {
this.documents.push(object);
}.bind(this));
}
}

Или использовать второй параметр выбора.еогеасп() (т. е. thisArg):

this.$onInit = function() {
const id = $route.current.params.someId;

this.documents = [];

myFactory.getData(id).then((response) => {
response.documents.forEach((object) => {
this.documents.push(object);
}, this);
}
}

Избежать зацикливания

Даже проще было бы спихнуть все предметы с распространением оператора, так как массив.метод push() может принимать переменное число элементов:

this.$onInit = function() {
const id = $route.current.params.someId;

this.documents = [];

myFactory.getData(id).then(response => this.documents.push(...response.documents));
}

Потому что ...response.documents буду выкладывать аргументы, чтобы соответствовать параметрам (т. е. element1[, ...[, elementN]]).

Этак нет необходимости обходить элементы. Массив.функция concat() может также использоваться, но тогда массив должен быть повторно назначены. Или Массива.unshift ПО() может также использоваться с распространением оператора.

Расширить приведенный ниже фрагмент для демонстрации (код в AngularJS удалены для простоты).



const documents = [];
const id = 3;
const myFactory = {
getData: function(id) {
const newDocuments = [1,2,3];
return new Promise(function(resolve, reject) {
setTimeout(resolve, 750, {"documents": newDocuments});
});
}
};
console.log('original documents',documents);
myFactory.getData(id).then(function(response) {
documents.push(...response.documents);
console.log('documents after push',documents);
})



2
ответ дан 23 февраля 2018 в 10:02 Источник Поделиться

В дополнение к тому, что слепой сказал, Я бы порекомендовал избегать использования this в вложенные области видимости , который является всегда запутанным и ошибок, путем присвоения documents на локальную переменную. т. е.

this.$onInit = function() {
const id = $route.current.params.someId;
let documents =this.documents = [];
...
response.documents.forEach((object) => {
documents.push(object);

2
ответ дан 23 февраля 2018 в 04:02 Источник Поделиться

Стрелки функции не обязаны this Так что ваш код может использовать this.

this.$onInit = function() {
const id = $route.current.params.someId;
this.documents = [];

myFactory.getData(id).then((response) => { // Arrow function
response.documents.forEach((object) => { // Arrow function

this.documents.push(object); // <<===== use this not _this

});
});
};

1
ответ дан 23 февраля 2018 в 02:02 Источник Поделиться