2013-02-15 56 views
0

我一直在构建模型系统,当它发生时,我可能通过使用映射插件使我的生活更轻松,但我面临的问题很少。基因敲除映射,初始值和计算结果

事情是我没有在初始化时刻的数据,但我仍然想提供空的属性到屏幕上。我通过在初始化时定义模型并稍后使用值更新模型来实现这一点。

App.Models.User = { 
    name: null, 
    username: null, 
    gender: null, 
    email: null, 
    img: null 
}; 
var me = ko.mapping.fromJS(App.Models.User); 

虽然我不知道这是完成任务的最佳方式,但工作得很好。

但是现在我想更新img属性,我不确定如果我想从它创建一个新的属性或让该属性更新自己,想知道两个方案都可以做到。

我从服务器的数据看起来有点像这个

{"me": 
    { 
     "username"  :"john", 
     "email"   :"[email protected]", 
     "name"   :"John Doe", 
     "gender"  :"male", 
     "img"   :"profile_img_john.jpg" 
    } 
} 

我想更新IMG或从它创建一个新的属性,使其images/profile_img_john.jpg

希望所有有意义。

回答

0

我会拆分淘汰赛视图模型创建和初始化部分。它可以让你创建没有任何实际数据的视图模型,将它绑定到HTML,然后用真实数据进行更新。

见例如我为你在这里创造:http://jsfiddle.net/apuchkov/zscP2/

var data = { "me": 
    { 
     "username"  :"john", 
     "email"   :"[email protected]", 
     "name"   :"John Doe", 
     "gender"  :"male", 
     "img"   :"profile_img_john.jpg" 
    } 
} 

var User = function(data) { 
    this.name = ko.observable(); 
    this.username = ko.observable(); 
    this.gender = ko.observable(); 
    this.email = ko.observable(); 
    this.img = ko.observable(); 

    this.update(data); 
}; 

ko.utils.extend(User.prototype, { 
    update: function(data) { 
     this.name(data.name || ""); 
     this.username(data.username || ""); 
     this.gender(data.gender || ""); 
     this.email(data.email || ""); 
     this.img(data.img || "default-image-url.png"); 
    } 
}); 

//firstly create viewmodel without any data 
var user = new User({}); 
ko.applyBindings(user); 

//then set data later 
user.update(data.me); 
+0

嗯,我使用一些非常相似,不同的是我创建的所有车型一个抽象的更新功能,其做工作,但我的目标是找出是否有可能阻止定义模型并使用'ko.mapping'插件来定义基于服务器数据的模型。我想如果你一开始没有任何数据,这是不太可能的,这很有道理,但也会带走我期望从'ko.mapping'获得的大部分好处,因为有一段时间没有答案,我会将你的标记标记为已接受。 – Giedrius 2013-02-20 16:18:28