Knockout 仅更新部分视图模型
Knockout update only part of the viewmodel
让我们假设一个来自 JS 的视图模式
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');
我也可以做一些事情
var js = {
Foo1 : {
BarA : 'text',
BarB : 'hello world' },
Foo2 : {
BarC : 'some text' }};
ko.mapping.fromJS(js, vm);
这两种情况都会更新绑定到 vm 的任何字段。Foo1.BarB
我想做的是
var foo = {
BarA : 'text',
BarB : 'hello world' };
ko.mapping.fromJS(foo, vm.Foo1);
这个不行,我也试过了
vm.Foo1(ko.mapping.fromJS(foo));
//and
vm.Foo1 = ko.mapping.fromJS(foo);
None 个正在工作。
我需要这个,因为在我的真实场景中,我的模型是 return 来自网络服务,更新 Foo1 和 Foo2 也是 returned 并且我不想要太多自定义映射。
显然还有一些神秘的附加参数..
ko.mapping.fromJS(foo, {}, vm.Foo1);
我不知道第二个参数是做什么的,但是如果你使用它,它就可以正常工作。
据我所知,这是不可能的。但是你可以这样做:
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(及其子项)。
您不想进行自定义映射,但考虑到其余 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 结果映射策略或将其考虑在内。
让我们假设一个来自 JS 的视图模式
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');
我也可以做一些事情
var js = {
Foo1 : {
BarA : 'text',
BarB : 'hello world' },
Foo2 : {
BarC : 'some text' }};
ko.mapping.fromJS(js, vm);
这两种情况都会更新绑定到 vm 的任何字段。Foo1.BarB
我想做的是
var foo = {
BarA : 'text',
BarB : 'hello world' };
ko.mapping.fromJS(foo, vm.Foo1);
这个不行,我也试过了
vm.Foo1(ko.mapping.fromJS(foo));
//and
vm.Foo1 = ko.mapping.fromJS(foo);
None 个正在工作。
我需要这个,因为在我的真实场景中,我的模型是 return 来自网络服务,更新 Foo1 和 Foo2 也是 returned 并且我不想要太多自定义映射。
显然还有一些神秘的附加参数..
ko.mapping.fromJS(foo, {}, vm.Foo1);
我不知道第二个参数是做什么的,但是如果你使用它,它就可以正常工作。
据我所知,这是不可能的。但是你可以这样做:
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(及其子项)。
您不想进行自定义映射,但考虑到其余 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 结果映射策略或将其考虑在内。