Knockout.js 敲除映射、初始值和计算值

Knockout.js 敲除映射、初始值和计算值,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我一直在构建模型系统,当它发生时,我可能会通过使用映射插件使我的生活更轻松,尽管我面临的问题很少 问题是,我在初始化时没有数据,但我仍然希望为屏幕提供空属性。我通过在初始化时定义模型,然后用值更新模型,实现了这一点 App.Models.User = { name: null, username: null, gender: null, email: null, img: null }; var me = ko.mapping.fromJS(App.Mod

我一直在构建模型系统,当它发生时,我可能会通过使用映射插件使我的生活更轻松,尽管我面临的问题很少

问题是,我在初始化时没有数据,但我仍然希望为屏幕提供空属性。我通过在初始化时定义模型,然后用值更新模型,实现了这一点

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"         :"johndoe@gmail.com",
        "name"          :"John Doe",
        "gender"        :"male",
        "img"           :"profile_img_john.jpg"
    }
}
我想更新img或从中创建一个新属性,并使其
images/profile\u img\u john.jpg


希望所有这些都有意义。

我将分离淘汰视图模型创建和初始化部分。它将允许您首先创建没有任何真实数据的视图模型,将其绑定到HTML,然后使用真实数据进行更新

请参见我在此处为您创建的示例:


我使用了一些非常相似的东西,除了我为所有模型创建了一个抽象更新函数,它完成了这项工作,但我的目标是找出是否有可能阻止定义模型,并使用
ko.mapping
插件,该插件将根据服务器的数据定义模型。如果一开始你没有任何数据,我想这是不可能的,这很有道理,但也带走了我从
ko.mapping
,anwyay所期望的大部分好处,因为有一段时间没有答案,我会将你的标记为已接受。
var data = { "me":
    {
        "username"      :"john",
        "email"         :"johndoe@gmail.com",
        "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);