Как переписать значение по умолчанию из свойств этого объекта с помощью вызова или применения метода в JS - PullRequest
0 голосов
/ 20 ноября 2018

Я начал изучать call, apply и bind, и теперь я хочу использовать его, но у меня есть некоторые проблемы:

У меня есть функция:

let addTableRow = function() {
    let template = HtmlTemplatesTelephony.ks.renderTableRow;
    this.id = "";
    this.creationDate = "";
    this.address = "";
    this.numberOfUser = "";
    this.accessExisting = true;
    $(DOM.tableBodyContainer).append(template(this));
};

Я объявил свойства thisв качестве значений по умолчанию

Здесь я вызываю функцию либо с .call (), либо без:

let updateTable = function() {
    let locations = userData().locations;
    if(locations.length > 0) {
        for(let location of locations) {
            UIController.addLocation.call(location);
        }
    } else {
        UIController.addLocation();
    }
};

Моя идея состояла в том, чтобы использовать значения this в addTableRow в качестве значений по умолчаниюв случае вызова функции без .call ().И когда я вызываю его с помощью .call (), я хочу перезаписать «this» значения по умолчанию.Но происходит прямо противоположное.

Я знаю, что могу передать объект в качестве параметра и установить объект по умолчанию, но есть ли другой способ сделать это с помощью .call ()?Или это неправильный вариант использования .call ()?

Спасибо за помощь!

***** ОБНОВЛЕНИЕ ******

Извините, это написано в шаблоне модуля, и я забыл упомянуть, что функция 'addTableRow' называется 'addLoaction' ввернуть объект.Вот еще немного кода:

Мой контроллер пользовательского интерфейса:

let UIController = (function() {
let DOM = {
    tableHeadContainer: $('thead'),
    tableBodyContainer: $('tbody'),
    inputNumberLocations: $('#numberLocations'),
    inputAddress: $('.js-location-address'),
    inputUser: $('.js-location-user'),
    inputVpn: $('.js-location-vpn'),
    btnDeleteLocation: $('.js-delete-location'),
};


let addTableRow = function() {
    let template = HtmlTemplatesTelephony.ks.renderTableRow;
    this.id = "";
    this.creationDate = "";
    this.address = "";
    this.numberOfUser = "";
    this.accessExisting = true;
    $(DOM.tableBodyContainer).append(template(this));
};


return {
    getDOM: DOM,
    addLocation: addTableRow,
    removeLocation: removeTableRow

}

}) ();

И мой главный контроллер:

let Controller = (function(dataController, UIController) {

let updateTable = function() {
    let locations = userData().locations; // locations has the same properties as in function 'addTableTow'
    if(locations.length > 0) {
        for(let location of locations) {
            UIController.addLocation.call(location);
        }
    } else {
        UIController.addLocation();
    }
};

return {
    init: function() {
        setupEventListeners();
        updateTable();
    },
}

}) (dataController, UIController);

Надеюсь, теперь все понятно.

1 Ответ

0 голосов
/ 20 ноября 2018

Когда вы .call(obj), вы начинаете свою функцию с this равным этому объекту.Когда вы говорите this.id = "", вы переопределяете id, которое у вас уже было.

Это может быть решением вашей проблемы:

if (!this.id) {
  this.id = "";
}
if (!this.property) {
  this.property = "default";
}
// etc.
...