2014-02-06 14 views
1

这是一个通用的体系结构问题。因此,想想MVC模型,其中包含数据的模型与特定的UI字段绑定,因此它们同时更新。将UI状态直接存储在数据模型中是否好?

现在我需要存储与该UI字段相关联的某个UI状态,例如指示该字段是否处于编辑模式的标志。用户界面将根据这个编辑标志进行更新,例如当编辑标志为真时它将显示一些编辑控件。

因此,我会更好地重用数据模型,并将状态与其他后端相关数据一起存储(我肯定不会将此标志发送回后端,因为后端并不涉及UI状态),或者创建一个新的容器跟踪UI状态?

+0

你是指服务器端作为后端。我认为一个持久性存储作为后端和服务器端编程(例如,用于Java中的jsp/servlets等)作为前端。 –

+0

@pawindergupta是的,在这种情况下,我将持久存储层称为后端,它处理读取/更新数据库。 –

回答

1

当UI窗体/模型变脏(用户首先启动与窗体的第一次交互)后,您将模型的状态(自然是UI)存储在一个对象中,我们称之为'bag'。 随着用户修改值,您会连续更新包。在用户尝试离开表单(关闭窗口,在浏览器等等中来回移动)之前,您可以将该包保存为cookie(如果它很小)或者对您的服务器进行发布并将其保存为json对象一个带有4个字段的表,如id,jsondata,modelUiIdentifier,userIdentifier。稍后当该页面稍后加载时,您可以获取该数据(如果它存在于该模型/用户界面和用户)并且保存模型对象(这会自动更新您的UI)。

如果使用angularjs,只是通过复制其数据通过相关的UI部分的$范围对象迭代(在$范围对象非“功能”的价值观,并发送至服务器像上面所解释的)

+0

感谢您的建议,他们是好点。然而,他们并没有真正回答我的问题,我问是否要存储UI状态,是否值得在包含数据的UI的模型中添加UI状态标志(例如'editing = true'),或者更好地将用户界面状态分成另一个对象? –

+0

你可以做到这一点。所以,他们会在同一个地方。您可以附加一个对象,比如我的model.editingstate = {},并使用编辑数据填充它,因为它们不会通过单独的包来污染模型。 – Nihat

+1

如果我想保存ui状态,我会单独保存它,并将状态数据与显示给用户的模型对象b4合并。我不希望我的模型具有这些额外的领域。我希望这可以帮助 – Nihat

1

状态数据,数据是状态。考虑到这一点,如果您需要存储与UI字段关联的某个UI状态,请使用工厂创建一个对象。改变那个对象,你改变UI状态。另外,工厂可以通过简单注入在整个项目中重复使用,管理不同状态的状态,并且易于测试。

更新:

服务的简单演示管理数据/状态http://plnkr.co/edit/PdDmUz?p=preview

的.html

<h3>Controller 1</h3> 
    Check me, to check both: 
    <input type="checkbox" ng-model="selected.data" /> 
    <pre>selected.data: {{selected.data}}</pre> 


<h3>Controller 2</h3> 
    <div ng-controller="MainCtrl2"> 
    Or, check me: 
    <input type="checkbox" ng-model="selected2.data" /> 
    <pre>selected2.data: {{selected2.data}}</pre> 

的.js

app.controller('MainCtrl', function($scope,uiFieldState) { 
    $scope.selected = uiFieldState.uiObject; 
}) 

app.controller('MainCtrl2', function($scope,uiFieldState) { 
    $scope.selected2 = uiFieldState.uiObject; 
}) 

app.factory('uiFieldState', function() { 
    return {uiObject: {data: null} }; 
}); 
+0

在我看来,我将“数据”称为存储在数据库中的实际数据(如用户名),将其绑定到用户界面的目的是显示并通过用户界面进行更新。然而,state是一个纯粹的可视化状态(就像这个字段处于焦点或编辑模式中一样),我认为这不值得进入包含后端数据的同一模型。所以在你的回答中,你是否建议我将UI状态存储在不同的对象中? –

+1

用户名'data'通常用于创建持久性授权/许可'状态'服务,任何'编辑模式'功能都将根据用户权限级别'data'在'状态'中有条件地应用。上面我已经使用服务对象添加了UI状态的示例。下面是一个示例应用程序(使用angularJS书进行应用程序开发),使用Object来控制诸如“编辑模式”之类的服务https://github.com/angular-app/angular-app/blob/master/client/ SRC /普通/安全/ security.js#L99 – cheekybastard

相关问题