Доступ к вычисленному значению в подписной функции

#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, чтобы помочь создать функцию.

http://knockoutjs.com/documentation/fn.html

Ответ №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>