Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.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
Javascript 在刷新之前不渲染客户端选择框(Breeze.js)_Javascript_Knockout.js_Breeze - Fatal编程技术网

Javascript 在刷新之前不渲染客户端选择框(Breeze.js)

Javascript 在刷新之前不渲染客户端选择框(Breeze.js),javascript,knockout.js,breeze,Javascript,Knockout.js,Breeze,毫无疑问,我在这里遗漏了一些显而易见的东西。这是我创建的第一个前端应用程序 我希望有一个客户端选择框,当选择一个选项时,实体上的一个单独属性将被更新。这意味着当选择框被更改时,将调用一个函数,该函数随后将适当地更新其他属性。我遇到的问题是,当在客户端创建实体时,选择框不会呈现 图片: :页面已加载。实体不存在子实体: :单击“添加子实体”,并创建子实体。如您所见,选择框没有任何选项。使用Chrome Knockout插件,我可以看到包含应该呈现的选项的属性是正确的 :我单击“保存”,然后刷新页面

毫无疑问,我在这里遗漏了一些显而易见的东西。这是我创建的第一个前端应用程序

我希望有一个客户端选择框,当选择一个选项时,实体上的一个单独属性将被更新。这意味着当选择框被更改时,将调用一个函数,该函数随后将适当地更新其他属性。我遇到的问题是,当在客户端创建实体时,选择框不会呈现

图片:

:页面已加载。实体不存在子实体:

:单击“添加子实体”,并创建子实体。如您所见,选择框没有任何选项。使用Chrome Knockout插件,我可以看到包含应该呈现的选项的属性是正确的

:我单击“保存”,然后刷新页面。选择框正确呈现,但重要的是,填充此选择框的值与第二步相同(通过敲除chrome插件验证)

HTML:

子初始值设定项:

function childInitializer(child) {
  child.propertyOne = ko.observable();
  child.propertyOneOptions = ko.observableArray();
}
propertyOne和propertyOne选项正在创建breeze实体初始值设定项:

function childInitializer(child) {
  child.propertyOne = ko.observable();
  child.propertyOneOptions = ko.observableArray();
}
数据模型:

public class Parent
{
  public Parent()
  {
    Children = new List<Child>();
  }
  [Key]
  public int Id { get; set; }

  public String OtherProperty { get; set; }

  public IList<Child> Children { get; set; }

}
public class Child
{
  [Key]
  public int Id { get; set; }

  public int ParentId { get; set; }

  [ForeignKey("ParentId")]
  public Parent Parent { get; set; }
}

到addChild方法的末尾,事情有所改进,即子选择框确实渲染,但在正确的子项下面有一个幻影子项:

您不应该调用valueHasMutated。我从来没有遇到过真正需要它的情况。问题很可能是,在通知已添加实体的Knockout之前,您没有加载所有属性,而当它尝试绑定时,绑定正在中断

function addChild() {
    // Don't pass a parent into createChild yet
    var child = dataservice.createChild();
    // After the entity is created, then assign the parent property
    child().parent(parent());
    console.log('Creating Child ' + child.propertyOneOptions().length);
    ko.utils.arrayForEach(propertyOneValues(), function (value) {
      child.propertyOneOptions.push(value);
    });
    console.log('Populated Child ' + child.propertyOneOptions().length);
  }

这对我来说总是有效的

我在options.init和options.update ko绑定中添加了调试语句,当我点击refresh时,它们被正确调用,但当我点击add时,它们却没有被正确调用。
dataservice.createChild(parent)
看起来像什么?它是否将创建的子项添加到父项列表中?
parent().children.valueHasMutated();
function addChild() {
    // Don't pass a parent into createChild yet
    var child = dataservice.createChild();
    // After the entity is created, then assign the parent property
    child().parent(parent());
    console.log('Creating Child ' + child.propertyOneOptions().length);
    ko.utils.arrayForEach(propertyOneValues(), function (value) {
      child.propertyOneOptions.push(value);
    });
    console.log('Populated Child ' + child.propertyOneOptions().length);
  }