在 JS MVC 框架中 - 与任何 JS 应用程序一样 - 您定义对象/类/模型并使用它们。如果您从 Web 服务(AJAX 调用)检索客户端列表,则 angularJS 会使用 $http 或 $resource 自动将其转换为 JS 对象(两者都在框架的网站中有详细记录)。但是您始终可以创建自己的,并立即或稍后通过 POST 将其添加到您的数据库中,并且无需更改“视图”即可添加模型的新实例。
这是我的应用程序的控制器示例。为清楚起见,大部分逻辑已被删除,并替换为注释。它表示一个条目,因为条目列表存储在父控制器中,并且控制器是通过 ng-repeat 指令生成的(见下面的 html 代码)。
控制器:
/**
* Entry Controller
* @class entryCtrl
*/
ucpaTpaApp.controller(
'entryCtrl',
['$scope', 'httpService',
function($scope, httpService) {
/**
* initiate the entry model, with all the required logic
* Called upon the controller's construction
*/
$scope.initEntry = function initEntry(){
if(!$scope.entry){
$scope.newEntry();
}
}
/**
* Set the fields of the entry, stored on the indicator's metadata
* for new entries.
*/
$scope.newEntry = function newEntry(){
$scope.entry = {
status: {
state: 'new',
connection: 'idle'
},
field_values: {},
saved_field_values: {},
title: ""
};
for(var field in $scope.fields){
$scope.entry.field_values[String($scope.fields[field].id)] = '';
}
};
$scope.resetFields = function resetFields(){
// Resets fields to original status (blank if it is new)
};
/**
* Save a new entry, adding it to the list of entries, and attempting
* to save to the server
*/
$scope.addEntry = function addEntry(){
// Add a copy to array, with status 'new',
// and call saveEntry on it
// After that, reset fields
};
$scope.deleteEntry = function deleteEntry(){
// Delete on WS, remove from array on confirmation
};
$scope.saveEntry = function saveEntry(){
// Save to WS, update status on confirmation
};
$scope.initEntry();
}]
);
模板:
<div class="indicator">
<h3>{{indicator.title}} - {{indicator.score}}</h3>
<div
ng-repeat="entry in indicator.entries"
ng-form="{{entry.id}}"
ng-controller="entryCtrl">
<tr-entry>
</tr-entry>
</div>
</div>
<div ng-controller="entryCtrl">
<tr-entry>
</tr-entry>
</div>
如您所见,条目列表使用 ng-repeat 指令显示(实际的条目 DOM 是使用它自己的指令 tr-entry 创建的)。然后,在此列表的末尾创建一个额外的条目,即“新”条目。如果该条目被保存(添加),它的条目模型被复制到数组中,并且 angularJS 尝试保存它。结果是:“新条目”将其字段设置为空白,并且新条目出现在 ng-repeat 列表中。当然,只有在收到确认已将其保存到数据库时,它的状态才会从“新”更改为“已保存”(由于后端执行数据验证,它可能会拒绝条目)。