2015-12-20 131 views
0

编辑 - 为每条评论添加更多“逼真的代码”。设计目标是所有模型都被视图模型包装,视图模型作为模型的代理。该视图不会直接绑定到模型。此外,我有一个单独的JavaScript类,它将模型发送到服务器或从服务器接收模型,并将其作为依赖注入到视图模型中。如何从视图模型自动更新模型属性?

下面,MessageModelcontent是用户输入的原始内容和/或服务器返回的内容。 MessageViewModel公开消息属性,该属性是模型的content属性的格式化版本。

function MessageModel(id, content, nick) { 
    var self = this; 
    self.nick = nick; 
    self.content = content; 
    self.id = id; 
} 

// view needs to bind to properties that only exist on the view model 
function MessageViewModel(messageModel, dataService) { 
    var self = this; 
    self.id = ko.observable(messageModel.id); 
    self.message = ko.computed(function() { 
     // format the content for the view 
     return messageModel.nick + " <" + messageModel.content + ">"; 
    }); 
    self.saveMessage(function() { 
     // send the model up to the server 
     dataService.saveMessage(self.model); 
    }); 
    self.model = messageModel; 
} 

与我上面写的,更改视图模型需要推到模型,并从服务器接收模式时,需要被推向反映在视图模型,然后在视图中进行更改。如何在淘汰赛中做到这一点?

+0

,如果你想通过再结合来更新'messageModel.id'它必须是'observable';目前viewModel id是您唯一可观察到的 – house9

+0

@ house9 - 不想通过绑定更新模型。想要通过绑定更新视图模型,然后使用视图模型更新模型。将模型直接耦合到视图并不好。 –

+0

你应该显示更实际的代码。创建一个持有'id'的对象是没有意义的,然后用另一个'id'将它包装到另一个对象中,从而完成两个相关的'id'可观察对象。如果'id'就是你所需要的,我相信你只有一个带有'id'的简单视图模型。所以,请让样本更真实,解释为什么你有一个嵌套模型,当父母的'id'发生变化时你想要发生什么,等等。你能用这些信息改进你的问题吗? – JotaBe

回答

1

这是更好地认为建模中的应用,而不是在你的应用程序代码分开实现数据模型。数据模型在服务器上,不是吗?将视图模型中的值复制到应用程序中的数据模型是完全多余的。将它们复制到服务器。 但是,如果你想,你可以subscribe到observable和复制其他地方的价值。

参见MVVM and ViewModels的文档,并注意区分是“存储”数据和应用程序之间的数据。数据(通常)存储在服务器上。一旦将它带入应用程序,它就是viewmodel数据。视图模型和模型之间的接口(通常)是将数据加载到应用程序并将其保存回服务器的ajax调用。

您需要在JavaScript模型中的唯一的事情就是你的应用程序,因为这是你写的所有。这不是其他任何数据源。如果实际的数据模型发生变化,您需要更改应用程序的行为,或者可以将更改隔离到加载和保存例程。有一个中间数据模型是零值。

+0

是的,你所说的不是MVVM。查看具有与模型相同或相同属性的模型是非常正常的。就服务器而言(与MVVM无关),DTO应该通过线路传输(我的模型目前是这样)。我会看看订阅。 –

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/10636745) –

+0

@ O.O请看我更新的回复。 –