#javascript #knockout.js
#javascript #knockout.js
Вопрос:
При использовании моей модели представления:
function SummaryViewModel (arrayString) {
//------- Attributes -------
var self = this;
self.Claims = ko.observableArray(namesapce.Helpers.subnamespace.ToCollection(arrayString));
self.ShowTable = ko.computed(function() {
var collection = ko.unwrap(self.Claims());
return collection.length > 0;
}, this);
self.showWarningPanel = self.ShowTable.Not();
}
Я пытаюсь инвертировать вычисленное значение. Таким образом, будет отображена либо таблица, либо предупреждающее сообщение.
Я создал следующую подписную функцию:
ko.subscribable.fn.Not = function () {
return ko.pureComputed(function() {
var bool = this();
return !(ko.unwrap(bool));
});
};
Однако значение для this()
не предоставляет значение вычисляемого атрибута. Вместо этого он возвращает все объекты в текущей области видимости.
Первоначально я пометил метод как ko.computed.fn
, и это также не вернуло вычисленное значение.
Я ссылался на документацию на веб-сайте KO, чтобы помочь создать функцию.
Ответ №1:
Вам нужно будет перейти this
к pureComputed
тому, что вы создаете внутри:
ko.subscribable.fn.Not = function () {
return ko.pureComputed(function() {
return !this();
}, this);
// ^^^^ Here, you tell knockout to execute the function with `this`
// context. Alternatively, you could use the var `self = this`
// pattern.
};
var myObs = ko.observable(true);
var invertedObs = myObs.Not();
myObs(false);
console.log("observable: " myObs());
console.log("inverted: " invertedObs());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>