Я все еще пытаюсь найти ответ Aurelia JS - Making a synchronous HTTP request, to change data before page load? - поэтому в примере кода для этого вопроса я попробовал следующее: https://gist.run/?id=90d98563621fe49c1dde6b4f2fc6961d.Aurelia - доступ к обновленным свойствам класса из инъекций?
Согласно Aurelia - how to change bound variables, so the GUI changes?, я знаю, что я могу изменить переменную класса, являющуюся источником привязки HTML, и HTML/GUI должен обновиться. Поэтому я пытаюсь что-то подобное в gist выше - в частности, я пытаюсь изменить свойство массива contacts
класса ContactList
(в contact-list.js
).
Вот соответствующие изменения в app-clist.js
:
import {WebAPI} from './web-api';
import {HttpClient} from 'aurelia-http-client';
import {ContactList} from './contact-list';
import {Container} from 'aurelia-dependency-injection';
// for multiline string, use backticks `` - ES6 template literals.
let phpcode = `
<?php
$outarr = array();
$tObj = new StdClass();
$tObj->{'id'} = '1';
$tObj->{'firstName'} = 'Bob';
$tObj->{'lastName'} = 'Glass';
$tObj->{'email'} = '[email protected]';
$tObj->{'phoneNumber'} = '243-6593';
array_push($outarr, $tObj);
$tObj = new StdClass();
$tObj->{'id'} = '2';
$tObj->{'firstName'} = 'Chad';
$tObj->{'lastName'} = 'Connor';
$tObj->{'email'} = '[email protected]';
$tObj->{'phoneNumber'} = '839-2946';
array_push($outarr, $tObj);
echo json_encode($outarr);
?>
`;
export class AppClist { // in gist example is wrong, still called App
static inject() { return [WebAPI, HttpClient, ContactList]; }
constructor(api, http, conlist){
this.api = api;
this.http = http;
this.conlist = conlist;
var phpcodesl = phpcode.replace(/(?:\r\n|\r|\n)/g, ' ');
var encphpcode = encodeURIComponent(phpcodesl); // urlencode
//alert(encphpcode);
// NOTE: gist.run due https will not allow loading from http
//this.http.post("https://phpfiddle.org/api/run/code/json", "code="+encphpcode)
//.then(response => {alert(response.response); console.log(response);}) // does not work
// this does work:
console.log("a1", this.conlist, this.conlist.contacts);
this.http.createRequest('https://phpfiddle.org/api/run/code/json')
.asPost()
.withHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8')
.withContent("code="+encphpcode)
.send()
.then(response => {
alert(response.response);
console.log(response);
var respobj = JSON.parse(response.response);
var respdataArr = JSON.parse(respobj.result);
this.api.setContactList(respdataArr);
console.log("a2", this.conlist, this.conlist.contacts, this.conlist.getThis(), Container.instance.get(ContactList));
}).catch(err => {
console.log(err);
})
;
}
...
... и я добавил эту console.log заявление в contact-list.js
:
created(){
this.api.getContactList().then(contacts => {
this.contacts = contacts;
console.log("b1", this, this.contacts); });
}
..., а также эта функция в contact-list.js
:
getThis(){
return this;
}
Однако, когда я запускаю этот (После нажатия на старт «жми меня» кнопку), я получаю это в журнале ошибок в Chromium браузер:
VM2198 app-clist.js!transpiled:48
a1 ContactList {api: WebAPI, contacts: Array[0]} []
...
contact-list.js:21
b1 ContactList {api: WebAPI, __observers__: Object} [Object, Object, Object, Object, Object]
...
VM2198 app-clist.js!transpiled:55
a2 ContactList {api: WebAPI, contacts: Array[0]} []
ContactList {api: WebAPI, contacts: Array[0]}
ContactList {api: WebAPI, contacts: Array[0]}
...
Итак, вот как я интерпретирую это:
- Сообщение
a1
печатается вconstructor()
AppClist
класс - и он запускается первым; в этот момент классContactList
предоставляется через инъекцию как свойство классаAppClist
под названиемconlist
. На данный момент,AppClist.conlist.contacts
(то есть,ContactList.contacts
) массив понятно пусто, и имеет размер 0. - Сообщение
b1
печатается, когдаContactList
компонентcreated()
, после того, какContactList.contacts
массив инициализирован, и печатается второй - снова , как и ожидалось, в массиве есть 5 элементов - Сообщение
a2
напечатано, когда HTTP-вызов завершен. Я ожидал бы 5 элементов в массивеcontacts
, но есть 0 (независимо от метода доступа)?!
Итак, мой вопрос: почему я получаю 0 как размер массива contacts
, когда должно быть не менее 5? Может ли inject
кэшировать состояние переменной/класса, к которому он должен ссылаться? Как я могу получить ссылку на последнее состояние свойства массива contacts
класса ContactList
в классе AppClist
?