2014-01-10 44 views
0

我在我的项目中使用了敲除。我有下面的代码的问题:为什么Object.create没有在javascript中创建新对象

var viewModel = ko.mapping.fromJSON('@Html.Raw(Json.Encode(Model))'); 

     function viewModelCollection() { 
      var self = this; 

      self.types = ko.observableArray([viewModel]); 

      self.add = function() { 
       //issue is here, the copy of viewModel object is adding 
       //here, instead of new object. 
       self.types.push(Object.create(viewModel)); 
      }; 

      self.remove = function() { 
       self.types.remove(this); 
      }; 
     } 

     ko.applyBindings(new viewModelCollection()); 

我在这里通过映射插件我是创建新的视图模型对象中获取一个空的对象从服务器。我还创建了viewModelCollection,它具有并且可以在该数组上操作viewModel和function。

问题是当我在添加函数中添加新对象时,它不是添加新对象,而是正在复制对象。所以在视图中,如果我在单个文本框中更改值,它会在所有文本框中更改。

为什么这行不是创建新的对象:

Object.create(viewModel); 

任何想法?

回答

0

您正试图在其自身内创建一个对象的新实例。 self.add是一个自我评估的变量,它不是一个匿名函数,因此它在viewModel完全实例化之前进行评估。在那一点上,如果你console.log(viewModel)它将返回null或undefined。

这将是你如何使用匿名函数来创建另一个视图模型

function viewModel() { 
    var self = this; 
    var something = ko.observable(); 
} 

function parentviewModel() { 
    var self = this; 
    var types = ko.observableArray(); 
    types.push(Object.create(viewModel)); 
    types.push(new viewModel()); 
} 

的内部视图模型的实例,但是,这是行不通的

var viewModel = function() { 
    var self = this; 
    var types = ko.observableArray(); 
    types.push(Object.create(viewModel)); 
    types.push(new viewModel()); 
} 
+0

请再次检查我的问题,我想你误会了 – user1740381

+0

不,你误解了匿名函数和变量之间的区别。 –

+1

请再次检查viewModelCollection和viewModel是2种不同的模型,add函数在viewModelCollection中。所以这就是为什么我不'在其内创建一个对象的新实例' – user1740381

0

当然,它是复制对象。你要告诉它复制viewmodel,这是你绑定的同一个对象。如果你想为每一个新的副本,你需要保持原来的副本新鲜。要做到这一点,最简单的方法是更改​​以下行

self.types = ko.observableArray([Object.create(viewModel)]); 

现在第一个放阵列中的一个副本,添加新功能将继续复制原始,而不是一个,你是绑定。 See it in action here

相关问题