Javascript 喷油器角度误差
我的应用程序出现以下错误 错误:[$injector:unpr]$injector/unpr?p0=ProductResourceProvider%20%3C-%20ProductResource 我的场景如下,一个从Web服务获取信息的简单应用程序,但是如果没有实现Web服务,我希望使用ng mock加载产品 在我的头标签中,我使用了如下代码:Javascript 喷油器角度误差,javascript,angularjs,ngresource,ngmock,Javascript,Angularjs,Ngresource,Ngmock,我的应用程序出现以下错误 错误:[$injector:unpr]$injector/unpr?p0=ProductResourceProvider%20%3C-%20ProductResource 我的场景如下,一个从Web服务获取信息的简单应用程序,但是如果没有实现Web服务,我希望使用ng mock加载产品 在我的头标签中,我使用了如下代码: <script src="//code.jquery.com/jquery-2.1.1.min.js" type="text/javascrip
<script src="//code.jquery.com/jquery-2.1.1.min.js" type="text/javascript"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js" type="text/javascript"></script>
<script src="//code.angularjs.org/1.3.2/angular-resource.min.js" type="text/javascript"></script>
<script src="//code.angularjs.org/1.3.2/angular-mocks.js" type="text/javascript"></script>
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.11.2.js"c></script>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet"/>|
<!-- Application Script -->
<script src="../Scripts/App/App.js" type="text/javascript"></script>
<!-- Services -->
<script src="../Scripts/App/Common/Services/common.services.js" type="text/javascript"></script>
<script src="../Scripts/App/Common/Services/productResource.js"></script>
<script src="../Scripts/App/Common/Services/productResourceMock.js" type="text/javascript"s></script>
<!--Controllers -->
<script src="../Scripts/App/Products/ProductListCtrl.js" type="text/javascript"></script>
产品控制器,非常简单:
(function () {
"use strict";
angular
.module("productManagement")
.controller("ProductListCtrl",
["ProductResource",
ProductListCtrl]);
function ProductListCtrl(productResource) {
var vm = this;
productResource.query(function (data) {
vm.products = data;
});
vm.showImage = false;
vm.toggleImage = function () {
vm.showImage = !vm.showImage;
}
}
}());
公共服务(具有ng资源)
然后是产品资源
(function () {
"use strict";
angular
.module("common.services")
.factory("productResource",
["$resource",
productResource]);
function productResource($resource) {
return $resource("/api/products/:productId")
}
}());
and finally product resource mock
(function () {
"use strict";
var app = angular
.module("productResourceMock",
["ngMockE2E"]);
app.run(function ($httpBackend) {
var products = [
{
"productId": 1,
"productName": "Leaf Rake",
"productCode": "GDN-0011",
"releaseDate": "March 19, 2009",
"description": "Leaf rake with 48-inch wooden handle.",
"cost": 9.00,
"price": 19.95,
"category": "garden",
"tags": ["leaf", "tool"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/26215/Anonymous_Leaf_Rake.png"
},
{
"productId": 2,
"productName": "Garden Cart",
"productCode": "GDN-0023",
"releaseDate": "March 18, 2010",
"description": "15 gallon capacity rolling garden cart",
"cost": 20.00,
"price": 32.99,
"category": "garden",
"tags": ["barrow", "cart", "wheelbarrow"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/58471/garden_cart.png"
},
{
"productId": 5,
"productName": "Hammer",
"productCode": "TBX-0048",
"releaseDate": "May 21, 2013",
"description": "Curved claw steel hammer",
"cost": 1.00,
"price": 8.99,
"category": "toolbox",
"tags": ["tool"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/73/rejon_Hammer.png"
},
{
"productId": 8,
"productName": "Saw",
"productCode": "TBX-0022",
"releaseDate": "May 15, 2009",
"description": "15-inch steel blade hand saw",
"cost": 6.95,
"price": 11.55,
"category": "garden",
"tags": ["garden", "mower"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/27070/egore911_saw.png"
},
{
"productId": 10,
"productName": "Video Game Controller",
"productCode": "GMG-0042",
"releaseDate": "October 15, 2002",
"description": "Standard two-button video game controller",
"cost": 2.22,
"price": 35.95,
"category": "gaming",
"tags": ["gaming", "controller", "video game"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/120337/xbox-controller_01.png"
}
];
var productUrl = "/api/products"
$httpBackend.whenGET(productUrl).respond(products);
var editingRegex = new RegExp(productUrl + "/[0-9][0-9]*", '');
$httpBackend.whenGET(editingRegex).respond(function (method, url, data) {
var product = {"productId": 0};
var parameters = url.split('/');
var length = parameters.length;
var id = parameters[length - 1];
if (id > 0) {
for (var i = 0; i < products.length; i++) {
if (products[i].productId == id) {
product = products[i];
break;
}
};
}
return [200, product, {}];
});
$httpBackend.whenPOST(productUrl).respond(function (method, url, data) {
var product = angular.fromJson(data);
if (!product.productId) {
// new product Id
product.productId = products[products.length - 1].productId + 1;
products.push(product);
}
else {
// Updated product
for (var i = 0; i < products.length; i++) {
if (products[i].productId == product.productId) {
products[i] = product;
break;
}
};
}
return [200, product, {}];
});
// Pass through any requests for application files
$httpBackend.whenGET(/app/).passThrough();
})
}());
(函数(){
“严格使用”;
有棱角的
.模块(“公共服务”)
.factory(“产品资源”,
[“$resource”,
产品资源),;
函数productResource($resource){
返回$resource(“/api/products/:productId”)
}
}());
最后是产品资源模拟
(功能(){
“严格使用”;
var app=角度
.module(“productResourceMock”,
[“ngMockE2E”];
app.run(函数($httpBackend){
var乘积=[
{
“productId”:1,
“产品名称”:“叶耙”,
“产品代码”:“GDN-0011”,
“发布日期”:“2009年3月19日”,
“说明”:“48英寸木柄叶耙”,
“成本”:9.00,
“价格”:19.95,
“类别”:“花园”,
“标记”:[“叶”、“工具”],
“imageUrl”:http://openclipart.org/image/300px/svg_to_png/26215/Anonymous_Leaf_Rake.png"
},
{
“productId”:2,
“产品名称”:“花园车”,
“产品代码”:“GDN-0023”,
“发布日期”:“2010年3月18日”,
“说明”:“容量为15加仑的滚动花园车”,
“成本”:20.00,
“价格”:32.99,
“类别”:“花园”,
“标签”:[“手推车”、“手推车”、“手推车”],
“imageUrl”:http://openclipart.org/image/300px/svg_to_png/58471/garden_cart.png"
},
{
“productId”:5,
“产品名称”:“锤子”,
“产品代码”:“TBX-0048”,
“发布日期”:“2013年5月21日”,
“说明”:“弯爪钢锤”,
“成本”:1.00,
“价格”:8.99,
“类别”:“工具箱”,
“标记”:[“工具”],
“imageUrl”:http://openclipart.org/image/300px/svg_to_png/73/rejon_Hammer.png"
},
{
“productId”:8,
“产品名称”:“Saw”,
“产品代码”:“TBX-0022”,
“发布日期”:“2009年5月15日”,
“说明”:“15英寸钢刃手锯”,
“成本”:6.95,
“价格”:11.55,
“类别”:“花园”,
“标签”:[“花园”、“割草机”],
“imageUrl”:http://openclipart.org/image/300px/svg_to_png/27070/egore911_saw.png"
},
{
“productId”:10,
“产品名称”:“视频游戏控制器”,
“产品代码”:“GMG-0042”,
“发布日期”:“2002年10月15日”,
“说明”:“标准双按钮视频游戏控制器”,
“成本”:2.22,
“价格”:35.95,
“类别”:“游戏”,
“标签”:[“游戏”、“控制器”、“视频游戏”],
“imageUrl”:http://openclipart.org/image/300px/svg_to_png/120337/xbox-controller_01.png"
}
];
var productUrl=“/api/products”
$httpBackend.whenGET(productUrl).response(products);
var editingRegex=newregexp(productUrl+“/[0-9][0-9]*”,“”);
$httpBackend.whenGET(editingRegex).respond(函数(方法、url、数据){
var product={“productId”:0};
var参数=url.split('/');
变量长度=parameters.length;
变量id=参数[长度-1];
如果(id>0){
对于(变量i=0;i
我检查了拼写,没有发现任何东西,所以我确定我在这里遗漏了什么
在我忘记剩下的html之前
<div ng-app="productManagement" class="container">
<div class="panel panel-primary">
<div class="panel-heading"
style="font-size:large">Product
List
</div>
<div class="panel-body">
<table class="table" ng-controller="ProductListCtrl as vm">
<thead>
<tr>
<td>
<button type="button"
class="btn btn-primary"
ng-click="vm.toggleImage()">
{{vm.showImage ? "Hide" : "Show"}} Image
</button>
</td>
<td>Product</td>
<td>Code</td>
<td>Available</td>
<td>Price</td>
</tr>
</thead>
<tbody>
<tr ng-repeat="product in vm.products">
<td>
<img ng-if="vm.showImage"
ng-src="{{product.imageUrl}}"
style="width:50px;margin:2px"
title="{{product.productName}}">
</td>
<td>{{ product.productName}}</td>
<td>{{ product.productCode }}</td>
<td>{{ product.releaseDate }}</td>
<td>{{ product.price | currency }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
产品
列表
{{vm.showImage?“隐藏”:“显示”}Image
产品
代码
可用
价格
(function () {
"use strict";
angular
.module("common.services")
.factory("productResource",
["$resource",
productResource]);
function productResource($resource) {
return $resource("/api/products/:productId")
}
}());
and finally product resource mock
(function () {
"use strict";
var app = angular
.module("productResourceMock",
["ngMockE2E"]);
app.run(function ($httpBackend) {
var products = [
{
"productId": 1,
"productName": "Leaf Rake",
"productCode": "GDN-0011",
"releaseDate": "March 19, 2009",
"description": "Leaf rake with 48-inch wooden handle.",
"cost": 9.00,
"price": 19.95,
"category": "garden",
"tags": ["leaf", "tool"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/26215/Anonymous_Leaf_Rake.png"
},
{
"productId": 2,
"productName": "Garden Cart",
"productCode": "GDN-0023",
"releaseDate": "March 18, 2010",
"description": "15 gallon capacity rolling garden cart",
"cost": 20.00,
"price": 32.99,
"category": "garden",
"tags": ["barrow", "cart", "wheelbarrow"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/58471/garden_cart.png"
},
{
"productId": 5,
"productName": "Hammer",
"productCode": "TBX-0048",
"releaseDate": "May 21, 2013",
"description": "Curved claw steel hammer",
"cost": 1.00,
"price": 8.99,
"category": "toolbox",
"tags": ["tool"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/73/rejon_Hammer.png"
},
{
"productId": 8,
"productName": "Saw",
"productCode": "TBX-0022",
"releaseDate": "May 15, 2009",
"description": "15-inch steel blade hand saw",
"cost": 6.95,
"price": 11.55,
"category": "garden",
"tags": ["garden", "mower"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/27070/egore911_saw.png"
},
{
"productId": 10,
"productName": "Video Game Controller",
"productCode": "GMG-0042",
"releaseDate": "October 15, 2002",
"description": "Standard two-button video game controller",
"cost": 2.22,
"price": 35.95,
"category": "gaming",
"tags": ["gaming", "controller", "video game"],
"imageUrl": "http://openclipart.org/image/300px/svg_to_png/120337/xbox-controller_01.png"
}
];
var productUrl = "/api/products"
$httpBackend.whenGET(productUrl).respond(products);
var editingRegex = new RegExp(productUrl + "/[0-9][0-9]*", '');
$httpBackend.whenGET(editingRegex).respond(function (method, url, data) {
var product = {"productId": 0};
var parameters = url.split('/');
var length = parameters.length;
var id = parameters[length - 1];
if (id > 0) {
for (var i = 0; i < products.length; i++) {
if (products[i].productId == id) {
product = products[i];
break;
}
};
}
return [200, product, {}];
});
$httpBackend.whenPOST(productUrl).respond(function (method, url, data) {
var product = angular.fromJson(data);
if (!product.productId) {
// new product Id
product.productId = products[products.length - 1].productId + 1;
products.push(product);
}
else {
// Updated product
for (var i = 0; i < products.length; i++) {
if (products[i].productId == product.productId) {
products[i] = product;
break;
}
};
}
return [200, product, {}];
});
// Pass through any requests for application files
$httpBackend.whenGET(/app/).passThrough();
})
}());
<div ng-app="productManagement" class="container">
<div class="panel panel-primary">
<div class="panel-heading"
style="font-size:large">Product
List
</div>
<div class="panel-body">
<table class="table" ng-controller="ProductListCtrl as vm">
<thead>
<tr>
<td>
<button type="button"
class="btn btn-primary"
ng-click="vm.toggleImage()">
{{vm.showImage ? "Hide" : "Show"}} Image
</button>
</td>
<td>Product</td>
<td>Code</td>
<td>Available</td>
<td>Price</td>
</tr>
</thead>
<tbody>
<tr ng-repeat="product in vm.products">
<td>
<img ng-if="vm.showImage"
ng-src="{{product.imageUrl}}"
style="width:50px;margin:2px"
title="{{product.productName}}">
</td>
<td>{{ product.productName}}</td>
<td>{{ product.productCode }}</td>
<td>{{ product.releaseDate }}</td>
<td>{{ product.price | currency }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
(function () {
"use strict";
angular
.module("productManagement")
.controller("ProductListCtrl",
["ProductResource",
ProductListCtrl]);
function ProductListCtrl(productResource) {
var vm = this;
productResource.query(function (data) {
vm.products = data;
});
vm.showImage = false;
vm.toggleImage = function () {
vm.showImage = !vm.showImage;
}
}
}());