KnockoutJS和计算属性不起作用

时间:2012-04-24 16:12:06

标签: javascript knockout.js

我刚刚开始淘汰这个模型和viewmodel:

$(function() {

  // Class to represent a note
  function Note(title, content) {
    var self = this;

    self.title = ko.computed(function() {
  var title = title;
  if(title.length > 0) return title;

  if(self.content && self.content.length > 0) return self.content.substring(0,19) + "...";   
    });   

    self.content = ko.observable(content);

  }

  // Overall viewmodel for this screen, along with initial state
  function TaccuinoViewModel() {
    var self = this;

    // Editable data
    self.notes = ko.observableArray([
    ]);

    // Operations
    self.addNote = function() {
        self.notes.push(new Note());
    }
    self.removeNote = function(note) { self.notes.remove(note) }
  }

  ko.applyBindings(new TaccuinoViewModel());

});

问题在于计算属性:我想要做的是:

1-)如果标题的长度> 0使用它 2-)如果没有定义,请使用内容+“......”的前20个字符。

但这不起作用......

关于这样做的任何建议,还有其他方式吗?

1 个答案:

答案 0 :(得分:4)

self.content是一个可观察的,所以你需要调用它才能获得当前值:

self.content = ko.observable(content);
self.title = ko.computed(function() {
    if(title.length > 0) return title;

    var currentContent = self.content(); // <-- get the current value
    if(currentContent) return currentContent.substring(0,19) + "...";   
});

请注意,我已将可观察“内容”的创建移到顶部,因为在创建计算的observable时,其初始值会被计算一次 - 因此我们可能需要“content”可观察到。