KnockoutJS - который запускается первым, расширители или подписки (настраиваются вручную или иным образом) и что делать, если они перезаписаны? - PullRequest
0 голосов
/ 16 мая 2018

Это кажется довольно простым вопросом, но я не могу найти много ответов или объяснений нигде без противоречий. Смотрите ниже класс;

export class Person {
    FirstName: KnockoutObservable<string>;
    Surname: KnockoutObservable<string>;
    FullName: KnockoutComputed<string>;
    SurnameExternalReference: KnockoutObservable<string>;

    constructor(data) {
        this.Name = ko.observable(data.Name).extend(someExtender: logChange);
        this.Surname = ko.observable(data.SurnameName).extend(someExtender: logChange);
        this.FullName = ko.copmuted(() => {
            return this.FirstName() + " " + this.Surname();
        }, this);
        this.SurnameExternalReference = ko.observable();

        this.Surname.subscribe(() => {
             //function here tests an external ko array of people for that surname 
             //and assigns this.SurnameExternalReference to that observable.
             //e.g.  - then sets sub back up as below only if found, otherwise this.SurnameExternalReference = null
             this.SurnameExternalReference = external.Surname;
             this.SurnameExternalReference.subscribe(() => {
                 this.Surname(this.SurnameExternalReference());
                 });

            });

        this.SurnameExternalReference.subscribe(() => {
            this.Surname(this.SurnameExternalReference());
        });
    }
}

Я написал это только для справки, мой фактический viewModel чрезвычайно сложен и его невозможно опубликовать, но он делает (и должен делать) это. logChange - это функция, которая проверяет ввод и регистрирует изменение, если оно действительно, иначе не записывает новое значение (или не вносит изменения).

Итак, мой вопрос: если свойство внешней фамилии будет изменено, в каком порядке будут вызываться расширители и функции? Принимая во внимание, что в подписке по фамилии this.SurnameExternalReference наследует экстендер.

Всегда ли экстендеры вызывают перед подпиской? Названы ли подписки в порядке их установки (я обнаружил, что многие люди соглашаются с тем, что порядок является довольно случайным И в том порядке, в котором они установлены)?

Если наблюдаемая внешне перезаписана, наследует ли она порядок внешнего саб / расширителя или добавляется в конец?

Довольно сложный вопрос, задавайте любые вопросы / публикуйте сценарии, если запутались.

РЕДАКТИРОВАТЬ: возможно ли расширение / подписки работать асинхронно или они могут работать только синхронно?

1 Ответ

0 голосов
/ 17 мая 2018

Довольно сложный вопрос

Согласен.Частично потому, что ваш пример кода делает некоторые вещи, которые он, вероятно, не должен делать.

Вызываются ли подписки в порядке их установки

Да.

Всегда ли экстендеры вызывают перед подпиской

Расширитель всегда имеет первую возможность «что-то сделать» с вновь созданной наблюдаемой.Например:

ko.extenders.logChange = function(obs, log) {
    if (log) obs.subscribe(console.log); // 1
    return obs;
};

const myName = ko.observable("Jane").extend({ logChange: true });
myName.subscribe(console.log); // 2

Подписка, созданная расширителем, присоединяется первой и будет делать первый журнал.Конечно, вы можете делать разные странные вещи в функции extender, а это значит, что гарантии нет.Этот надуманный пример меняет местами порядок журналов:

ko.extenders.logChange = function(obs, log) {
    if (log) setTimeout(() => obs.subscribe(console.log)); // 2
    return obs;
};

const myName = ko.observable("Jane").extend({ logChange: true });
myName.subscribe(console.log); // 1

. Для вашего более сложного случая я бы посоветовал вам установить некоторые точки останова в коде и обновить наблюдаемое, чтобы изучить порядок, в котором находятся зависимости.оценено.

Если это не поможет вам решить вашу реальную проблему, вы можете предоставить работоспособный пример логики, которую вы пытаетесь реализовать.

Примечание: при создании подписок внутри другой подписки, лучше избавиться от ранее созданных, чтобы предотвратить странное поведение.

...