Приостановить привязки в knockout.js 1.2.1 - PullRequest
7 голосов
/ 21 февраля 2012

Есть ли возможность приостановить и возобновить привязки в нокауте?

Версия: knockout.js 1.2.1

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

Теперь в этом текущем сценарии форма полностью связана с моделью представления. Когда мы очищаем комбо и добавляем каждый элемент, представление обновляется, следовательно, происходит значительная задержка. Если бы у меня были средства для приостановки привязки, я мог бы приостановить, затем загрузить все данные в модель представления и затем возобновить привязку.

Ответы [ 3 ]

7 голосов
/ 21 февраля 2012

Я не думаю, что есть способ приостановить привязку в knockout.js. Трудно сказать, не видя код, но медлительность, вероятно, вызвана тем фактом, что вы обновляете свои observableArrays, очищая их и добавляя новые элементы один за другим. Вместо этого вы можете обновить весь массив сразу:

...
self.manyItems = ko.observableArray();
...
function refreshItems(newItems){
    self.manyItems(newItems);
}
5 голосов
/ 09 апреля 2012

Возможно приостановление и возобновление: взгляните на это демо , составленное Райаном Нимейером. Обратитесь к этой записи в своем блоге для получения дополнительной информации.

0 голосов
/ 28 сентября 2017

Если вам действительно нужно приостановить подписки, я нашел способ приостановить их в вычисляемых наблюдаемых с помощью pauseableComputed (идея взята из с этого сайта ). Я немного изменил его, чтобы добавить pauseableComputed, возможность иметь функции чтения и записи.

viewModel.myComputedObservable = ko.pauseableComputed(function() {
    return myResult;
}, viewModel);

Для приостановки вы вызываете myComputedObservable.pause();, вносите все свои изменения, а затем вызываете myComputedObservable.resume(); для этих изменений, чтобы активировать подписки в вычисляемой наблюдаемой.

   //wrapper for a computed observable that can pause its subscriptions
        ko.pauseableComputed = function (evaluatorFunction, evaluatorFunctionTarget) {
            var _cachedValue = "";
            var _isPaused = ko.observable(false);

            //the computed observable that we will return
            var result;
            if (evaluatorFunction.read) {
                result = ko.computed({
                    read: function() {
                        if (!_isPaused()) {
                            //call the actual function that was passed in
                            return evaluatorFunction.read.call(evaluatorFunctionTarget);
                        }
                        return _cachedValue;
                    },
                    write: function(value) {
                        if (!_isPaused()) {
                            //call the actual function that was passed in
                            return evaluatorFunction.write.call(evaluatorFunctionTarget, value);
                        }
                        return _cachedValue;
                    }
                }, evaluatorFunctionTarget);
            } else {
                result = ko.computed(function() {
                    if (!_isPaused()) {
                        //call the actual function that was passed in
                        return evaluatorFunction.call(evaluatorFunctionTarget);
                    }
                    return _cachedValue;
                }, evaluatorFunctionTarget);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...