2017-04-06 65 views
0

这是代码knockout.js在主视图模型视图模型一个(新增项目是不确定的)

<form data-bind="submit: addItem"> 
New item: 
<input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' /> 
<button type="submit" data-bind="enable: itemToAdd().length > 0">Add</button> 
<p>Your items:</p> 
<select multiple="multiple" width="50" data-bind="options: items"> </select> 

这是视图模型

var SimpleListModel = function(items) { 
    this.items = ko.observableArray(items); 
    this.itemToAdd = ko.observable(""); 
    this.addItem = function() { 
     if (this.itemToAdd() != "") { 
      this.items.push(this.itemToAdd()); // Adds the item. Writing to the "items" observableArray causes any associated UI to update. 
      this.itemToAdd(""); // Clears the text box, because it's bound to the "itemToAdd" observable 
     } 
    }.bind(this); // Ensure that "this" is always this view model 
}; 

var masterVM = (function() { 
     var self = this;  
     self.SimpleListModel= new SimpleListModel(["Alpha", "Beta", "Gamma"]); 

})(); 
ko.applyBindings(masterVM); 

我必须有多个的ViewModels我页面。所以对于初学者,我创建了一个视图模型并将其放入一个主视图模型中。但addItem变得未定义。为什么是这样?我怎样才能使这种方法工作?

编辑

<div data-bind="with: viewModel2"> 
     <div> 
      <span data-bind="text: boardtext" />       
     </div>   
     <a href="#" id="addVar" data-bind="click: addList ,visible: sh">Add a List</a><br /><br /> 
     <form method="post">   
     <div data-bind="foreach: lists" id="thumbnails">    
      <div class="thumbnail-container"> 
       <span data-bind="text:listname"></span><br /><br /><br /><br /> 
       <div id="abc"> 
        <ul class="list-group" data-bind="foreach: cardlists"> 
         <li class="list-group-item"> 
          <span data-bind="text: cardname"></span> 
          <a href="#" data-bind="click: $root.removecard">Del</a> 
         </li> 
        </ul> 
        <a href="#" data-bind="click: $parent.showhideaddcard,visible: cardvisiblity">Add Card</a><br /> 
        <div data-bind="visible: showRenderTimes"> 
         <input type="text" data-bind="value: $parent.cardtext" /><br /><br /><br /> 
         <input type="button" value="Add" data-bind="click: $parent.addcard" /> 
         <input type="button" value="Cancel" data-bind="click: $parent.cancelcard" /> 
        </div> 
        <div data-bind="visible: showlist"> 
         <input type="text" data-bind="value: $parent.listtext" /><br /><br /> 
         <input type="button" value="Save list" data-bind="click: $parent.addbuttonlist" /> 
        </div> 
       </div> 
      </div> 
     </div> 

     <p class="alignRight"> 
      <input type="submit" value="Update"> 
     </p> 
    </form> 
</div> 
+0

有你的包裹里面的html用':SimpleListModel'? – muhihsan

+0

我只是做了一个包装:SimpleListModel围绕此代码的一个div – maztt

+0

它不起作用 – maztt

回答

2

你需要使用with: ...包装形式。这是示例。

var SimpleListModel = function(items) { 
 
    this.items = ko.observableArray(items); 
 
    this.itemToAdd = ko.observable(""); 
 
    this.addItem = function() { 
 
    console.log("trigger AddItem"); 
 
    }.bind(this); // Ensure that "this" is always this view model 
 
}; 
 

 
var masterVM = (function() { 
 
    var self = this;  
 
    self.SimpleListModel= new SimpleListModel(["Alpha", "Beta", "Gamma"]);  
 
})(); 
 

 
ko.applyBindings(masterVM);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<div data-bind="with: SimpleListModel"> 
 
    <form data-bind="submit: addItem"> 
 
    New item: 
 
    <input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' /> 
 
    <button type="submit" data-bind="enable: itemToAdd().length > 0">Add</button> 
 
    <p>Your items:</p> 
 
    <select multiple="multiple" width="50" data-bind="options: items"></select> 
 
    </form> 
 
</div>

+0

绝对是比我的更清洁的解决方案,不知道'与'绑定,伟大的东西。 – DibsyJr

1

的问题是,SimpleListModel是绑定到页面的masterVM的属性,这意味着你必须前缀的HTML所有观察到的绑定与SimpleListModel像这样:

<form data-bind="submit: SimpleListModel.addItem"> 
New item: 
<input data-bind='value: SimpleListModel.itemToAdd, valueUpdate: "afterkeydown"' /> 
<button type="submit" data-bind="enable: SimpleListModel.itemToAdd().length > 0">Add</button> 
<p>Your items:</p> 
<select multiple="multiple" width="50" data-bind="options: SimpleListModel.items"> </select> 

的jsfiddle:https://jsfiddle.net/me7Lj5r1/

+0

那么$ root.removefunction呢?这是以前在我的代码中工作。我没有在这里展示过。 – maztt

+0

非常多,或者替代方法是在使用SimpleListModel属性的HTML中包装div的div中使用with binding。如果你不需要masterVM并且只是将SimpleListModel绑定到页面上,那么一切都可以正常工作,但按照现在的方式进行操作会更方便,因为这意味着你可以拥有多个视图模型。 – DibsyJr

+0

如何在view-model中插入viewmodel:$ root.removefunction – maztt

相关问题