无法访问knockout.js mvvm中的viewmodel来操纵项目

问题描述:

我正在使用Knockout.js,require.js等MVVM web应用程序。问题是我无法访问属性(类型observable数组)在我的viewmodel。无法访问knockout.js mvvm中的viewmodel来操纵项目

合同样本模型:

define('model.contract', ['ko'], 
    function (ko) { 
     var Contract = function() { 
      var self = this; 
      self.id = ko.observable(); 
      self.subject = ko.observable().extend({ required: true }); 

      self.shoppingItems = ko.observableArray(); 

      }; 
      return Contract; 
    }); 

样品视图模型:

define('vm.contract', ['ko'], 
    function (ko) { 
     var contract = ko.observable(), // Is initialised as viewmodel activates 

      deleteCmd = function() { 

       var selectedId = getSelectedId(), 
        deletedId = contract.shoppingItems.remove(function (item) { return item.id === selectedId; }); 

       alert('Item ' + deletedId[0].id + ' was deleted!'); 
      }; 

     return { 
      contract: contract, 
      deleteCmd: deleteCmd 
     }; 
    }); 

样的看法:

<div data-bind="template: {name: shoppingItemTemplate, foreach: contract().shoppingItems}"></div> 
<button data-bind="click: deleteCmd">Delete Selected</button> 

所有我需要在视图模型访问是contract.shoppingItems和我得到的是未定义。

为什么你定义你的contractobservableArray而不是仅仅是observable

也不要忘了,你应该叫contract()得到的contract观察到的值:

// ... 
deletedId = contract().shoppingItems.remove(function (item) { return item.id === selectedId; }); 
// ... 

更新: 只注意到你正确定义model.contract。请将您的return ContractContract定义块之外:)

define('model.contract', ['ko'], 
    function (ko) { 
     var Contract = function() { 
      var self = this; 
      self.id = ko.observable(); 
      self.subject = ko.observable().extend({ required: true }); 

      self.shoppingItems = ko.observableArray(); 
     }; 

     return Contract; 
    } 
); 
+0

对不起这是一个错误。我纠正了它。你对'contract()'是正确的,但问题依然存在。 – Pejman 2013-03-16 10:29:26

+0

查看更新的答案。 – 2013-03-16 10:37:13

+0

嗯,这很尴尬,但这个问题只存在于我的原代码中。我也在这里纠正。其实我的模型工作正常,这就是为什么我的'shoppingItems'列表的绑定工作。 – Pejman 2013-03-16 10:44:34