Javascript 从ObservalArray绑定未定义的字段或提供默认值

Javascript 从ObservalArray绑定未定义的字段或提供默认值,javascript,node.js,mongodb,knockout.js,mongoose,Javascript,Node.js,Mongodb,Knockout.js,Mongoose,有什么问题 假设我想在我的MongoDB上执行一个查询,并将结果显示在一个表中。有些文档比其他文档有更多或更少的字段-这对我来说很好。但我在客户端遇到了一个问题 我使用“mongoose”和一个模型通过NodeJ检索数据,然后在客户端上,我使用“knockout.js”将列表绑定到表。现在问题就出现在这里——只要任何字段不存在,但绑定到表中,KO就会抛出异常并停止处理 我尝试了什么 我试图在mongoose模型上定义一个默认值,但这不会添加不存在的字段。此外,它将增加通过导线的有效载荷-( 我

有什么问题

假设我想在我的MongoDB上执行一个查询,并将结果显示在一个表中。有些文档比其他文档有更多或更少的字段-这对我来说很好。但我在客户端遇到了一个问题

我使用“mongoose”和一个模型通过NodeJ检索数据,然后在客户端上,我使用“knockout.js”将列表绑定到表。现在问题就出现在这里——只要任何字段不存在,但绑定到表中,KO就会抛出异常并停止处理

我尝试了什么

  • 我试图在mongoose模型上定义一个默认值,但这不会添加不存在的字段。此外,它将增加通过导线的有效载荷-(

  • 我尝试了“knockout.punchs”和“default”文本过滤器,效果很好,但只有当值为null或空时,Undefined仍会引发异常

  • 我尝试了几种方法来使用KO的扩展机制,但要么我必须在绑定中编写有线语法,要么它对未定义的也不起作用

  • 到目前为止,我还没有尝试的另一种可能性是在客户端创建一个模型,然后将其映射到响应——老实说,我只是不想这样做,因为在大多数情况下,数据库中的数据结构是完全正确的,这只会意味着额外的工作

我在找什么

是否有人有办法自动将mongoose模型中缺少的字段添加到响应中,或者让它运行,以便KO不会停止处理未定义的字段(是否有一些参数).在我的例子中,这是一个可观察的解决方案,这里的大多数解决方案和解决方案都是关于单个字段的。对于一个包含未定义字段的列表来说,这是一个非常有趣的解决方案

谢谢

[{"firstname":"Foo", "lastname":"Bar"},{"firstname":"John"}];

self.allUsers = ko.observableArray();

self.onResponseAllUsers = function (response) {
            if (response && response.length > 0) {                
                self.allUsers(response);
            }
        };

<tbody data-bind="foreach: allUsers">
<tr>
<td data-bind="text: firstname"></td>                           
<td data-bind="text: lastname"></td>   <<<< This is undefined for one row, and KO stops processing.
</tr>
</tbody>
[{“firstname”:“Foo”,“lastname”:“Bar”},{“firstname”:“John”}];
self.alluser=ko.observearray();
self.onResponseAllUsers=函数(响应){
如果(response&&response.length>0){
自我诱惑者(反应);
}
};

有两种方法可以解决这个问题

  • 您可以在绑定中使用| |为缺少属性的情况提供默认值,因此绑定如下:-

    <tbody data-bind="foreach: allUsers">
       <tr>
        <td data-bind="text: $data.firstname"></td>
        <td data-bind="text: $data.lastname || 'NA'"></td> // used $data context property
       </tr>
    </tbody>
    


  • 谢谢,解决方案1很有魅力——我总是错过$data,这就不同了。
    function User(item) {
      this.firstname = item.firstname || "NA";
      this.lastname = item.lastname || "NA";
    }
    var viewmodel = function (data) {
      var self = this;
      self.allUsers = ko.observableArray();
      self.onResponseAllUsers = function (response) {
      if (response && response.length > 0) {
         ko.utils.arrayForEach(response, function (item) {
            self.allUsers.push(new User(item));
         });
      }
     };
      self.onResponseAllUsers(data);
    }