【问题标题】:Knockout complex viewmodel problems淘汰复杂的视图模型问题
【发布时间】:2013-01-09 22:49:13
【问题描述】:

有人可以帮助解释我可能犯的根本错误。 我需要能够有一个模型,它可以对一组对象进行分组,每个对象都有自己的一组绑定。

一个小提琴展示了我如何处理一个只有 1 个块的示例,但最后我想要多个块。

HTML

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"
type="text/javascript"></script>
<div class="productblock">
  <div class="product">
    <input class="binding" data-bind="value: amount" type="text" value="1">
  </div>
  <div class="product">
    <input class="binding" data-bind="value: amount" type="text" value="2">
  </div>
  <input class="discount" data-bind="value: discount" value="50">
</div>

</div>
  <span id="res" data-bind="text: result">result here </span>

js

function ResultViewModel() {
  this.result = ko.computed(function () {
    return 1;
  });
}

function ProductViewModel(val) {
  this.amount = ko.observable(val+1);
  this.sum = function () {
    return this.amount();
  };
}

  var products = [];
function ProductBlockViewModel(block) {
  $.each($(block).find("div.product"), function (index, element) {
    var product = new ProductViewModel($(element).find("input").val());
    products.push(product);
    ko.applyBindings(product);
  });
  this.discount = ko.observable(22);

}
var productBlocks = [];
$.each($("div.productblock"), function (index, element) {
  console.log("a");
  var productBlock = new ProductBlockViewModel(element);
  productBlocks.push(productBlock);
  ko.applyBindings(productBlock, element);
  console.log("asdf");
});

ko.applyBindings(new ResultViewModel()); http://jsfiddle.net/Todilo/DGUKu/2/

【问题讨论】:

  • 如果你检查浏览器控制台,你会看到有一个错误阻止你的代码被执行。我仍然不明白你想要达到什么目的。我相信还有另一种方法可以让代码更简单,不推荐重叠 applyBindings
  • 我需要能够映射 A 产品块 1 产品 2 产品 B 产品块 1 产品 2 产品其他一些东西,但我找不到任何使用现有数据的示例
  • 基本上它的嵌套我无法弄清楚。

标签: knockout.js


【解决方案1】:

查看演示:http://jsfiddle.net/DGUKu/7/

我将重新构建您的代码以使其更简洁。

HTML:

<!-- ko foreach: productBlocks -->
<div class="productblock">
   <!-- ko foreach: productLines -->
  <div class="product">
    <input class="binding" data-bind="value: amount" type="text">
  </div>
  <!-- /ko -->
  <input class="r" data-bind="value: discount" value="50">
</div>
    <hr/>
<!-- /ko -->

<div>
<span id="res" data-bind="text: result"></span>
</div>

JS:

function ProductModel (){
  this.amount = ko.observable(0);
  this.sum = function () {
    return this.amount();
  };
}

// product block contains multiple product line
function ProductBlockViewModel(productArray) {
  this.productLines = ko.observableArray(productArray);
  this.discount = ko.observable(50);
}

// your viewmodel for binding data
// should call applybindings only one
function ViewModel(){
  this.result = ko.observable(0);
  this.productBlocks = ko.observableArray([]);
}

var viewModel = new ViewModel();

// let assume you have 2 blocks:

// block 2 products
viewModel.productBlocks.push(new ProductBlockViewModel([
  new ProductModel(), new ProductModel()
]));

// block 3 products
viewModel.productBlocks.push(new ProductBlockViewModel([
  new ProductModel(), new ProductModel(), new ProductModel()
]));

// you can calculate your total result here
viewModel.result(100);

ko.applyBindings(viewModel);

【讨论】:

  • 这看起来是一个很好的开始,但是当我已经定义了 html 和块列表时,我该如何处理呢?所以我想从 DOM 中“读取它们”。
  • 你的意思是你有一个字符串 html 作为模板?
  • 我的意思是,如果我已经在页面上定义了产品块,并且我想在创建它们之后进行绑定。在这里,您使用 foreach 创建它们,然后将它们推送到可观察数组中。问题是 productsblocks 有很多其他信息,整个页面来自 MVC asp.net。所以我想“阅读”那个 html 结构并将其放入可以根据块、产品等计算成本的模型中
  • 我知道我正在扩展淘汰赛要做的事情,但我觉得 jQuery 并不是真正为像我需要的那样动态更新而构建的,我还没有找到任何其他替代方案
  • 在这种情况下,您应该尝试 JQuery 模板。试试这个链接:github.com/jquery/jquery-tmplstephenwalther.com/archive/2010/11/30/…
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 2013-07-08
  • 2012-11-09
  • 2012-11-29
相关资源
最近更新 更多