【问题标题】:Knockout JS Observable Array and Model bindingKnockout JS Observable Array 和 Model 绑定
【发布时间】:2014-11-27 12:54:17
【问题描述】:

我正在尝试学习如何使用淘汰赛,但还没有找到一个简单的例子来说明我想要实现的目标。我只是想将我的 mvc Model 类中的 List 绑定到我的 viewModel 以进行淘汰。例如,如果我有下面的模型..这是一个类文件。

public class PropaneMaintModel
{
   public List<PropaneMaintAssignment> PropaneMaint{get;set;}
   public List<string> LocationIds { get; set; }
   public int? SelectedLocation { get; set; }
}

public class PropaneMaintAssignment
{
    public int StoreNumber { get; set; }
    public int Tanks { get; set; }

    [Required(ErrorMessage="Tank Size must have a value")]
    [Range(0,10000,ErrorMessage="Tank Size must be between 0 and 10000.")]
    public int TankSize { get; set; }
}

如何让列表“PropaneMaint”与淘汰赛绑定一起使用?我需要像淘汰赛网站上的示例一样从列表中添加/删除。我的视图模型定义如下,但它不起作用。

 function propaneMaintViewModel() {
    var viewModel = this;

    viewModel.PropaneMaint = ko.observableArray([]);
    viewModel.addNew = function () {
        viewModel.PropaneMaint.push(
            {
                StoreNumber: 0,
                Tanks: 0,
                TankSize: 0
            }
       );
    }
}

ko.applyBindings(new propaneMaintViewModel());

【问题讨论】:

  • 您是否在某处创建propaneMaintViewModel 的新实例?调用 ko.applyBindings(propaneMaintViewModel()); 看起来不对。您应该在别处构造一个propaneMaintViewModel 并在ko.applyBindings 中使用它或调用ko.applyBindings(new propaneMaintViewModel());
  • 我不是,但我同意只为参数添加“新”。关于页面标记,我只是用一些按钮为每个循环做一个剃刀。我看到了一个淘汰赛示例,但它不适用于从模型中填充的列表。

标签: c# asp.net-mvc-4 knockout.js knockout-mvc


【解决方案1】:

Knockout 没有直接绑定到任何 c# 模型。您可以做的是将您的 MVC 视图模型序列化为 json 对象,然后将其绑定。即:

function bindModels(arr) {
    var propaneMaintAssignments = new Array();
    for (var i = 0; i < arr.length; i++)
        propaneMaintAssignments.push(new PropaneMaintAssignment(arr[i]));
    return propaneMaintAssignments;
}

function PropaneMaintAssignment(model) {
    for(var property in model)
       this[property] = model[property];  //bind all properties
}

var json = @Html.Raw(new JavaScriptSerializer().Serialize(Model.PropaneMaint)); //results in an array
var list = bindModel(json);  //makes an array of named objects
viewModel.PropaneMaint(list);  //adds that array of named objects to your observableArray

【讨论】:

  • hmmm 很有趣,cmets 解释每个步骤是有道理的。但是我想知道为什么淘汰赛示例使用 data-bind="foreach: list"?这适用于什么环境,为什么它在这里不起作用?
  • 我刚刚注意到您正在使用 KnockoutMVC;我对那个库并不完全熟悉,因为我只使用基本的 knockout.js 和 mvc。 foreach 绑定为数组中的每个值做一些事情。这个小提琴显示了一个示例:该示例中的jsfiddle.net/LkqTU/19585 list 应该只是要迭代的视图模型属性名称。
  • 正确,我终于可以让它工作了。我使用了一种稍微不同的方法,它只绑定了我的模型的列表属性与整个模型。谢谢:D
猜你喜欢
  • 2017-12-13
  • 2014-10-01
  • 2014-06-09
  • 2015-04-05
  • 2015-08-15
  • 2017-04-25
  • 2013-04-22
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多