让我们假设来自JS的视图模式
$(".cediv").resizable({
handles: 'e, w'
}).rotatable({
});
现在我可以做
var js = {
Foo1 : {
BarA : 'text',
BarB : 'other text' },
Foo2 : {
BarC : 'some text' }};
var vm = ko.mapping.fromJS(js);
ko.applyBindings(vm);
我也可以做类似的事情
vm.Foo1.BarB('hello world');
两种情况都将更新绑定到vm.Foo1.BarB的任何字段
我想做的是类似的事情
var js = {
Foo1 : {
BarA : 'text',
BarB : 'hello world' },
Foo2 : {
BarC : 'some text' }};
ko.mapping.fromJS(js, vm);
这不起作用,我也尝试过
var foo = {
BarA : 'text',
BarB : 'hello world' };
ko.mapping.fromJS(foo, vm.Foo1);
他们都没有工作。
我需要这个,因为在我的实际场景中,我的模型是从Web服务返回的,更新Foo1和Foo2也都返回了,并且我不需要太多的自定义映射。
答案 0 :(得分:0)
显然还有一些神秘的附加参数。
[UIApplication.LaunchOptionsKey.remoteNotification] as? [AnyHashable: Any]
我不知道第二个参数的作用,但是如果使用它,它就可以正常工作。
答案 1 :(得分:0)
据我所知,这是不可能的。但是您可以这样做:
var js = {
Foo1 : {
BarA : 'text',
BarB : 'other text' },
Foo2 : {
BarC : 'some text' }};
var vm = ko.mapping.fromJS(js);
ko.applyBindings(vm);
//later, after fetching data from the webservice:
//data = {
// Foo1 : {
// BarA : 'text',
// BarB : 'other text' },
//}; note: Foo2 is not defined
ko.mapping.fromJS(data, {}, vm);
映射后,仅Foo1(及其子代)将被更新。
答案 2 :(得分:0)
您不想进行自定义映射,但是考虑到其余api可能需要更改,请考虑一下如果您直接依赖于API结果,这意味着什么。
即说您的api结果为:
{
name: 'Ryan',
title: 'Developer'
gender: 'M',
birthDate: '01-01-1984',
employeeCode: '0123156'
}
因此,您可以在整个标记中使用以下内容:
<label data-bind="text: user.employeeCode"></label>
您在100多个地方标记了整个标记的字段名称。您需要在计算的可观察变量,函数以及以及不断依赖它们。您对该API有100%的硬性依赖。
如果要更改或替换该api,并且对返回的数据使用不同的格式,则整个应用程序都将中断,并且必须修复很多东西。
另一方面,如果您有一个服务层js文件,该文件为api结果创建了自定义对象的实例,那么您只需更改服务层即可。
您可以轻松切换api,而不必更改任何可观察对象,ui绑定等。您已经在应用程序和后端数据之间创建了一个耦合层,并且可以交换耦合来更改整个后端。
我知道这不是您问题的答案,但我会重新考虑您是api结果映射策略还是将其考虑在内。