gpt4 book ai didi

javascript - AngularJS - CRUD 指令/服务/ Controller 模式

转载 作者:搜寻专家 更新时间:2023-11-01 04:33:04 25 4
gpt4 key购买 nike

我想创建一些以某种方式与父 Controller /作用域交互的指令。我以两种方式进行增删改查:A)如果你要编辑一个项目,我会使用 $location 将 url 更改为给定的 urlB)基于同一页面,如果你点击一个项目的编辑,它会从 $scope.tpl 设置 $scope.template,然后在部分中我有一个 ng-hide/show 隐藏和显示 TableView /详细 View 。

我想要实现的可能是在我的指令中使用更少的代码,并可能使用更多基于服务的方法或提示?

指令

'use strict';

/* Directives */
var directives = angular.module("app.directives", ["ui"]);


function CrudCtrl($scope, $attrs, $location, $parse) {
function getScope(scopeName) {
scopeName = typeof scopeName || "$parent";
var ngModel = $parse(scopeName, $scope);
return ngModel($scope)
}

function refreshObjects(scopeName) {
$scope.svc.query($scope.params, function(objects) {
var parentScope = getScope(scopeName)
parentScope.objects = objects
});
}

if (!$scope.refreshObjects) {
$scope.refreshObjects = function() {
refreshObjects($attrs.modelname)
}
}

if (!$scope.crudAdd) {
$scope.crudAdd = function() {
if ($attrs.url) {
$location.path($attrs.url);
return;
} else {
var parentScope = getScope($attrs.scope);
parentScope.object = new $scope.svc();
parentScope.template = parentScope.tpl;
}
}
}

if (!$scope.crudDelete) {
$scope.crudDelete = function() {
/* Fire off a delete and as a callback we update objects */
$scope.svc.delete({accountId: $scope.account.uuid, id: $scope.object.id}, function() {
refreshObjects($attrs.scopeName)
});
};
}

if (!$scope.crudEdit) {
$scope.crudEdit = function() {
if ($attrs.url) {
$location.path($attrs.url);
return;
} else {
var parentScope = getScope($attrs.scopeName);
parentScope.object = $scope.object;
parentScope.template = parentScope.tpl;
}
};
}

if (!$scope.crudSave) {
$scope.crudSave = function() {
var params = {}
params.accountId = $scope.params.accountId
if ($scope.object.id) { params.id = $scope.object.id }

$scope.object.$save(params, function() {
if ($attrs.url) {
$scope.back();
} else {
refreshObjects($attrs.scopeName);

var parentScope = getScope($attrs.scopeName);
parentScope.template = undefined;
}
});
};
}

if (!$scope.crudCancel) {
$scope.crudCancel = function() {
if (parentScope.template) {
var parentScope = getScope($attrs.scopeName);
parentScope.template = undefined;
} else {
$scope.back();
}
};
};
};


directives.directive("refresh", function() {
return {
restrict: "E",
replace: true,
controller: CrudCtrl,
scope: true,
link: function(scope, element, attrs) {
scope.display_text = attrs.text;
},
template: '<button class="btn btn-mini btn-primary" ng-click="refreshObjects()"><i class="icon-refresh"></i> Refresh</button>',
};
});


/* Create something new */
directives.directive("create", function() {
return {
restrict: "E",
replace: true,
controller: CrudCtrl,
scope: true,
link: function(scope, element, attrs) {
scope.display_text = attrs.text;
},
template: '<button class="btn btn-mini btn-success" ng-click="crudAdd()"><i class="icon-plus"></i> {{display_text || "Add"}}</button>',
};
});


/* Delete button and update objects */
directives.directive("delete", function() {
return {
restrict: "E",
replace: true,
controller: CrudCtrl,
scope: true,
link: function(scope, element, attrs) {
scope.display_text = attrs.text;
},
template: '<button class="btn btn-mini btn-danger" ng-click="crudDelete()"><i class="icon-remove icon-white"></i> {{display_text}}</button>',
}
});

/* Helper to create a edit button */
directives.directive("edit", function() {
return {
restrict: "E",
replace: true,
controller: CrudCtrl,
scope: true,
link: function(scope, element, attrs) {
scope.display_text = attrs.text;
},
template: '<button class="btn btn-mini btn-info" ng-click="crudEdit()"><i class="icon-edit"></i> {{display_text || "Edit"}}</a>',
}
});

/* Save the object and return to the previous page */
directives.directive("save", function() {
return {
restrict: "E",
replace: true,
controller: CrudCtrl,
scope: true,
link: function(scope, element, attrs) {
scope.display_text = attrs.text;
},
template: '<button class="btn btn-success" ng-click="crudSave()"><i class="icon-ok"> {{display_text || "Save"}}</i></a>',
};
});

/* Cancel the current action */
directives.directive("cancel", function() {
return {
restrict: "E",
replace: true,
controller: CrudCtrl,
scope: true,
link: function(scope, element, attrs) {
scope.display_text = attrs.text;
},
template: '<button class="btn" ng-click="crudCancel()"><i class="icon-remove"></i> {{display_text || "Cancel"}}</button>'
}
});

Controller 示例

function BookingCtrl($scope, Booking) {
$scope.svc = Booking;
$scope.objects = $scope.svc.query($scope.params);
}

然后在部分概述中我有:

<div ng-hide="template">
<refresh></refresh>
<create url="/{{params.accountId}}/entity/add"></create>

<table class="table table-condensed table-hover">
<thead>
<tr>
<th></th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="object in objects">
<td>
<delete></delete>
<edit url="/{{params.accountId}}/category/{{object.resource_id}}"></edit>
</td>
<td>{{object.resource_name}}</td>
<td>{{object.description}}</td>
</tr>
</tr>
</tr>
</tbody>
</table>
</div>

<ng-show="template" ng-include src="template"></ng-show>

细节部分:

<div class="span4">
<h3>Category: {{category.resource_name}}</h3>
<form name="detail_form" class="form-horizontal">
<div class="control-group">
<label class="control-label"><strong>Name</strong></label>
<div class="controls">
<input required ng-model="object.resource_name" placeholder="Name" type="text" class="input-small">
</div>
</div>
<div class="control-group">
<label class="control-label"><strong>Description</strong></label>
<div class="controls">
<textarea ng-model="object.description" placeholder="Description" type="textarea" rows=5></textarea>
</div>
</div>
<div class="control-group">
<save scope-name="$parent.$parent"></save>
<cancel scope-name="$parent.$parent"></cancel>
</div>
</form>
<pre>form = {{object | json}}</pre>
</div>

使用 $parent 似乎太过分了。$parent 如果有更好的方法解决这个问题,请帮助我!

最佳答案

我会通过以下方式处理此类功能:

  • $resource 投入使用。
  • 使用 ng-view 绑定(bind) url 和部分。使用 anchor 链接到其他部分。
  • 根据 Angular 色为每个部分定义 Controller 。(通过服务访问 $resource)

http://angularjs.org/#wire-up-a-backend可能就是例子。

关于javascript - AngularJS - CRUD 指令/服务/ Controller 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12903451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com