淘汰赛仅更新视图模型的一部分

时间:2019-07-03 11:41:13

标签: knockout.js knockout-mapping-plugin

让我们假设来自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也都返回了,并且我不需要太多的自定义映射。

3 个答案:

答案 0 :(得分:0)

显然还有一些神秘的附加参数。

[UIApplication.LaunchOptionsKey.remoteNotification] as? [AnyHashable: Any]

我不知道第二个参数的作用,但是如果使用它,它就可以正常工作。

https://stackoverflow.com/a/29598785/2968001

答案 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结果映射策略还是将其考虑在内。