2016-01-29 102 views
2

我有像这样的一个用户对象:淘汰赛映射响应对象

var userModel = { 
    Id: ko.observable(), 
    Email: ko.observable().extend({ email: true, required: true, maxLength: 200 }), 
    FirstName: ko.observable().extend({ required: true, minLength: 2, maxLength: 200 }), 
    LastName: ko.observable().extend({ required:true, minLength: 2, maxLength: 200 }), 
    DefaultLanguage: ko.observable(), 
    Phone: ko.observable().extend({phoneUS:true}), 
    AvatarUrl: ko.observable(), 
    Claims: ko.observableArray() 
}; 

我加载的响应,并希望到对象的响应绑定。响应与模型的格式完全相同:

self.user = userModel; 
self.loadData = function (params) { 
     $.get('/api/user/' + params.id).then(function (data) { 
      console.log('GET User', data); 
      self.user.Id(data.Id); 
      self.user.Email(data.Email); 
      self.user.FirstName(data.FirstName); 
      self.user.LastName(data.LastName); 
      self.user.Phone(data.Phone); 
      self.user.DefaultLanguage(data.DefaultLanguage); 
      self.user.AvatarUrl(data.AvatarUrl); 
      self.user.Claims(data.Claims); 
     }); 
    }; 

虽然上面的工作很棒,但它真的很长。有没有更简单的方法来绑定对象?

+0

你可以用 'ko.mapping.fromJS()'(http://knockoutjs.com/documentation/plugins-mapping.html) –

+0

尝试,它并没有self.user工作是不是功能。 – allencoded

+0

这不起作用? ko.mapping.fromJS(data,{},self.user); –

回答

2

您可以使用JavaScript反射

$.get('/api/user/' + params.id).then(function (data) { 
      for(var i in data){ 
       if(data.hasOwnProperty(i) && self.user.hasOwnProperty(i)) 
       { 
         self.user[i](data[i]); 
       } 
      } 
     }); 

这可以被转移到函数,使事情更容易。当你有可观察对象的嵌套结构以及可观察属性和标准属性的组合时,它会变得更加复杂。但基于你的例子,这将工作。

另外。 ko.mapping.fromJS会起作用,但有时候会很痛苦。

0

我喜欢用的图案是水合物/再水合物。 Here is a codepen证明了这一点。

var User = function(init) { 
    var self = this; 
    self.firstName = ko.observable(); 
    self.lastName = ko.observable(); 
    self.city = ko.observable(); 

    this.update = function(data) { 
    data = data || {}; 
    Object.keys(data).forEach(function(key) { 
     self[key](data[key]); 
    }); 
    } 
    this.update(init); 
} 

这允许任何人都可以轻松地进行更新,因为必要时可以提供尽可能多的属性。

setTimeout(function() { 
    user.update({ 
    firstName: 'Tim', 
    lastName: 'Moran', 
    city: 'Portland' 
    }) 
}, 2000) 

但是,如果在很多模型上完成,这可能会变得单调乏味,因此您可以将其拉入基本模型。

var baseViewModel = { 
    update: function(data) { 
    data = data || {}; 
    var self = this; 
    Object.keys(data).forEach(function(key) { 
     self[key](data[key]); 
    }); 
    } 
} 

var User = function(init) { 
    var self = this; 
    self.firstName = ko.observable(); 
    self.lastName = ko.observable(); 
    self.city = ko.observable(); 

    this.update(init); 
}; 

User.prototype = baseViewModel;