首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在KnockoutJS中传递BoilerplateJS视图模型

在KnockoutJS中传递BoilerplateJS视图模型
EN

Stack Overflow用户
提问于 2012-09-21 07:39:15
回答 2查看 395关注 0票数 2

嵌套组件也预先假定嵌套视图模型。

但是,在示例组件中,我没有看到这种依赖(除了对KO用户不太清楚的BackboneJS TODO应用程序)。

你能否详细说明如何进行这样的设计,例如为一个集合:

  • 具有属性的ItemViewModel ( NameIsSelected )
  • CollectionViewModel with具有一个Items属性,该属性包含ItemViewModelSelectedCount的集合,该集合是通过计算所选项的数量来计算的。(我知道用KO可以用一种更简单的方法来做,但只是为了说明。
EN

回答 2

Stack Overflow用户

发布于 2012-10-04 06:39:57

视图模型(VM)只是对象(使用ko.applyBindings()绑定)--这意味着您可以任意地将VM嵌套到父对象中( @Hasith说过)。您只需要将一个父对象传回样板。请接受一些超注释的代码:

代码语言:javascript
复制
// Let's assume you have your items nicely formatted in an array 
// data source (and technically the objects in this array can be 
// considered 'dumb' viewmodels)
var items = [
  {Name:'a',isSelected:false}, 
  {Name:'b',isSelected:true}
  ]

// We can apply some bindings to make 'smarter' viewmodels
// One approach is just to map using rocking KO mapping plugin
var koMapItems = ko.mapping.fromJS( items )

// You could skip the mapping plugin and go for broke
// creating your own VM mappings manually
// (you could do this using the mapping plugin with less work)
var goforbrokeVM = function( item )
{
  var _name = ko.observable( item.Name )
  var _dance = function() { return _name+' is space monkey' }

  return {
    Name: _name,
    isSelected: ko.observable( item.isSelected ),
    spaceMonkey: _dance
  }
}
// Don't forget to assign and create your goforbrokeVMs
var epicItemVMs = []
for (var i=0;i<items.length;i++) 
  epicItemVMs.push( new goforbrokeVM( items[i]) )


// Now the interesting part, lets create a 'child' VM that
// we can embed in another VM. Notice this VM has as a
// property an array of VMs itself.
var childVM = {
  elements: epicItemVMs,
  // A sub method, because we can
  otherMethod: function() { return 'wat' }
}

// And ultimately our 'master' VM with its own properties
// including the nested child VM we setup above (which you'll
// remember contains its own sub VMs)
var ParentVM = {
  // And its own property
  parentPropA: ko.observable('whatever'),

  // Oooow look, a list of alternative ko.mapping VMs
  simpleMappedItems: koMapItems,

  // And a nested VM with its own nested goforbrokeVMs
  nested: childVM
}

// Apply your master viewmodel to the appropriate DOM el.
ko.applyBindings( ParentVM, document.getElementById('items'))

还有你的HTML:

代码语言:javascript
复制
<div id="items">
  <span data-bind="text: parentPropA"></span>

  <!-- Step through one set of items in ParentVM -->
  <div data-bind="foreach: simpleMappedItems">
    <input type="checkbox" data-bind="checked: isSelected">
    <span data-bind="text: Name"></span>
  </div>

  <!-- Or jump into the nested models and go crazy -->
  <!-- ko with: nested -->
    <div data-bind="foreach:elements">
      <div data-bind="text: spaceMonkey"></div>
    </div>
    <div data-bind="text: otherMethod"></div>
  <!-- /ko -->
</div>

通过这种方式,您可以将单个对象(在本例中为ParentVM)传递给样板,并根据需要使用任意数量的嵌套视图模型。

为击倒生命映射插件的信息:http://knockoutjs.com/documentation/plugins-mapping.html

票数 2
EN

Stack Overflow用户

发布于 2012-09-21 08:58:38

“todo”示例是通过采用Addy的实现完成的。同时也有这里的实现。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12526176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档