Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 对空值进行敲除可观察检查_Asp.net_Knockout.js - Fatal编程技术网

Asp.net 对空值进行敲除可观察检查

Asp.net 对空值进行敲除可观察检查,asp.net,knockout.js,Asp.net,Knockout.js,我想知道是否有一种方法可以在将数据放入可观察对象之前进行敲除检查,以查看数据是否为null 现在我这样做: if (!data.Filename) { this.FileName = ko.observable(""); } else { this.FileName = ko.observable(data.Filename); } 否则,数据中的null值将导致整个属性不显示。有没有一种方法可以使用扩展器或者我可以添加空检查的东西,而不必对每个属性都这样做?我的数据在我无法控

我想知道是否有一种方法可以在将数据放入可观察对象之前进行敲除检查,以查看数据是否为
null

现在我这样做:

if (!data.Filename) {
    this.FileName = ko.observable("");
}
else {
    this.FileName = ko.observable(data.Filename);
}
否则,数据中的null值将导致整个属性不显示。有没有一种方法可以使用扩展器或者我可以添加空检查的东西,而不必对每个属性都这样做?我的数据在我无法控制的随机位置有空值,我不希望属性不显示,因为数据集中的一行具有该属性的空值

似乎应该有更好的方法来做到这一点。

有很多方法可以做到这一点。我要做的是

var self = this;
self.fileName = ko.observable(data.Filename);
self.fileNameComputed = ko.computed(function(){
       return self.fileName() || ""
});

然后,在您的标记引用中,如果可观察的对象是可观察的,则会计算该值。

在Javascript中,还有其他模式可用于执行此操作

第一个也是最简单的,类似于C#中的
运算符:

|
运算符将返回左操作数,除非它是左操作数,然后返回第二个参数。我上面的例子是:

  • 确保
    数据
    本身“至少”是一个空对象(其中
    文件名
    未定义)
  • 确保
    ko.observable(…)
    的输入“至少”是空字符串
  • 第二个选项是使用默认选项。使用jQuery合并输入数据和默认选项的示例:

    var defaultData = {
      Filename: "enter-a-file" // could also be empty string of course!
    };
    
    function ViewModel(data)  {
      var dto = $.extend({}, defaultData, data);
      this.Filename = ko.observable(dto.Filename);
    }
    
    这将把
    数据
    折叠成
    默认数据
    ,并将结果折叠成一个空的新对象,确保
    dto
    变量保存合并的结果。然后,函数的其余部分可以安全地假定一个完全填充的输入变量

    我要提到的第三个也是最后一个选项是混音,但我同意评论者的观点(在你的例子中,这很好),你可能应该:

    function ViewModel(data)  {
      var self = this;
      data = data || {};
      this.Filename = ko.observable(data.Filename);
      this.FilenameText = ko.pureComputed(function() {
        return self.Filename() || "";
      });
    }
    


    另外,您没有提到您提到的根本问题,因为您在
    这个
    数据
    上分别用不同的大小写拼写了
    文件名
    文件名
    ,不是吗?;-)

    你说的“不出现”是什么意思?你能给我们看一些带绑定的html吗?或者在JSfDeDLE的一个工作示例中,当数据从服务器返回时,它有一个属性“文件名”,当我把它映射到我的SabababLayLy时,“文件名”属性不会被映射,并且它不会被绑定到任何东西中。除非问题是关于淘汰赛的旧版本:)我仍然停留在版本2.0上,所以这就是我所熟悉的,这是因为几个原因。。。最重要的是,它是最简单的,另一个原因是它将self.Filename保持为null或数据,我使用它来表示一个条件…不,我没有意识到任何潜在的问题。数据是以data.Filename的形式出现的,我使用这个(self.Filename)作为可观察对象,实际上什么都不做。我做过很多其他的事情,这似乎并不重要。
    function ViewModel(data)  {
      var self = this;
      data = data || {};
      this.Filename = ko.observable(data.Filename);
      this.FilenameText = ko.pureComputed(function() {
        return self.Filename() || "";
      });
    }