AngularJS 应用程序需要重用多个自定义对象。我担心创建难以维护的混乱、冗余的代码,因此我将可重用的代码移动到一个服务中,该服务可以简洁地注入到每个视图的控制器中,然后直接从每个 html 视图中调用,而不用多余的代码来混乱控制器代码。
下图说明了该服务如何someclass.js
将被重用,因此将尽可能多的代码隔离在一处很重要:
我已经开发了在我的开发盒上部分完成此任务的代码,并且我已经将代码发布到 plnkr。 (感谢 @shakir 获取此 plnkr 来重现问题。)我还包括下面的代码。
尽管单击表单提交按钮确实会导致调用服务中表单的处理程序方法,但问题是应包含表单数据的对象在应处理表单数据的 someclass.method1() 方法中未定义。需要对下面的代码进行哪些具体更改,以便可以在服务的表单处理方法内操作用户从表单提交的数据的值?
视图和服务之间(通过控制器)通信的完整要求是:
1.) someclass.prop1
可以将其值打印在视图中(这在下面的代码中有效),并且
2.) the ng-submit
of confirmForm
可以直接调用someclass.method1
作为处理程序,从而最大限度地减少代码someroute.js
(这发生在下面的代码中,但是当someclass.somemethod1()
在跑)
plnkr代码:
Here is 普林克致电建议的服务@JoaozitoPolo
。当前版本可以调用someclass.method1()
从视图中,但表单数据未传递到函数中。所以我们需要弄清楚如何将表单数据传递到函数中。
此处还显示代码:
(在我的开发盒上)连接属性和方法的代码someview.html
with someclass.js
(但不会将表单中的数据发送到someclass.js
在函数调用期间)包含如下:
这是代码someclass.js
:
angular
.module('someclass', ['ngCookies'])
.service('someclass', ['$rootScope', '$http', '$cookies', function($rootScope, $http, $cookies){
this.prop1 = $cookies.get('test1');
this.prop2 = 'nothing';
this.resultphone = {};
this.method1 = function(isValid, resultphone) {
if(isValid){
var funcJSON = resultphone;
funcJSON.wleadid = '1';//resultphone is undefined in debugger here
alert("just a filler to add breakpoint for debugger");
$http.post('/some-test-service', funcJSON).then(
function(response) {
prop2 = response.data.content;
}
);
}
};
}]);
这是代码someroute.js
:
angular
.module('someroute', ['someclass'])
.controller('someroute', function($scope, someclass) {
$scope.someclass = someclass;
});
Here is someroute.html
:
someclass.prop1 is: {{someclass.prop1}} <br>
someclass.prop2 is: {{someclass.prop2}} <br>
<div ng-show="someclass.prop1!='yes'">
<h1>someclass prop1!</h1>
<div ng-include="'someroute_start.html'"></div>
</div>
<div ng-show="someclass.prop1=='yes'">
<div ng-show="someclass.prop2=='showfirst'">
<h1>Include start.</h1>
<div ng-include="'someroute_first.html'"></div>
</div>
<div ng-show="someclass.prop2=='showsecond'">
<h2>Include second.</h2>
<div ng-include="'someroute_second.html'"></div>
</div>
</div>
Here is someroute_start.html
,其中包括需要处理的表单someclass.js
:
<form name="confirmForm" ng-submit="someclass.method1(confirmForm.$valid)" novalidate>
Enter some value:
<input type="text" name="phonenum1" ng-model="resultphone.phonenum1" required />
<button type="submit" ng-disabled="confirmForm.$invalid" >Submit</button>
</form>
为了完整起见,我包括someroute_first.html
,这很简单:
<h3>Showing first! </h3>
And someroute_second.html
,这很简单:
<h3>Showing second! </h3>
该应用程序的主控制器是hello.js
,我将其包含在这里,以防解决方案的一部分包括初始化someclass
:
angular
.module('hello', [ 'ngRoute', 'someclass', 'home', 'someroute', 'navigation' ])
.config(
function($routeProvider, $httpProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
templateUrl : 'home.html',
controller : 'home'
})
.when('/someroute', {
templateUrl : 'someroute.html',
controller : 'someroute'
}).otherwise('/');
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
}
)
为了完整性,index.html
加载模块如下:
<!DOCTYPE html>
<html>
<head>
<script>document.write('<base href="' + document.location + '" />');</script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular-route.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha/css/bootstrap.min.css"></script>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" />
<link href="style.css" rel="stylesheet"/>
<style type="text/css">
[ng\:cloak], [ng-cloak], .ng-cloak { display: none !important; }
</style>
</head>
<body class="ng-cloak" ng-cloak="" ng-app="hello">
<div class="container" ng-controller="navigation">
<ul role="tablist" class="nav nav-pills">
<li ng-class="{active:tab('home')}">
<a href="#/">home</a>
</li>
<li ng-class="{active:tab('someroute')}">
<a href="#/someroute">some route</a>
</li>
</ul>
</div>
<div class="container" ng-view=""></div>
<script type="text/javascript" src="someclass.js"></script>
<script type="text/javascript" src="home.js"></script>
<script type="text/javascript" src="someroute.js"></script>
<script type="text/javascript" src="navigation.js"></script>
<script type="text/javascript" src="hello.js"></script>
</body>
</html>
同样,上述所有代码都包含在在此 plnkr 重现问题所需的最低限度的代码摘录. 那么需要进行哪些具体更改 1.) 让 plnkr 工作以及 2.) 获取要传递到调用中的表单数据someclass.method1()
?