如何从共享工厂绑定数组或对象
How to bind an array or an object from a shared factory?
我有一个名为Model
的Angular工厂,它在多个控制器之间共享。基本上,这个Model
封装了属性和助手方法。
我现在正试图将这个模型与我的视图绑定,但我有一个奇怪的行为,Model
的嵌套对象和对象数组没有正确绑定。
我认为这个问题是由于我试图通过引用修改另一个对象中的一个对象。也许我丢失了嵌套元素的上下文?
我该如何解决这个问题?
这是我的应用程序:
var app = angular.module('plunker', []);
app.factory('Blog', function() {
function Blog(id) {
this.load(id);
}
Blog.prototype = {
name: "",
description: [{
value: ""
}, {
value: ""
}, {
value: ""
}],
website: {
name: "",
url: ""
},
load: function(id) {
},
helper1: function() {
// implementation
},
helper2: function() {
// implementation
}
// many other helpers...
}
return Blog;
});
app.controller('MainCtrl', function($scope, Blog) {
$scope.model = new Blog(12);
});
最后我的观点
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.2.x" src="https://code.angularjs.org/1.2.22/angular.js" data-semver="1.2.22"></script>
<script src="app.js"></script>
</head>
<body ng-controller="MainCtrl">
<p>Name <input ng-model="model.name"></p>
<div ng-repeat="line in model.description">
Description line {{$index}} <input ng-model="line.value">
</div>
<p>Website name <input ng-model="model.website.name"></p>
<p>Website url <input ng-model="model.website.url"></p>
<p>Result : {{ model | json }}</p>
</body>
</html>
为了说明这个问题,我创建了一个plunker示例在输入字段中输入值时,Model
不会随更改而更新。只有字段name
更新
提前感谢
服务由Angular实例化,然后在需要的地方注入它们的引用。只需按照更改代码
var app = angular.module('plunker', []);
app.factory('Blog', function() {
return {
name: "",
description: [
{value: ""},
{value: ""},
{value: ""}
],
website: {
name: "",
url: ""
},
helper1: function() {
// implementation
},
helper2: function() {
// implementation
}
// many other helpers...
}
//return new Blog();
});
app.controller('MainCtrl', function($scope, Blog) {
$scope.model = Blog;
});
服务、工厂和供应商的工作方式略有不同。我希望你清楚,其他明智的阅读这篇优秀的文章
http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/
新型plunkr
http://plnkr.co/edit/FGOcPWVMeFDSyVtmv8Xd?p=preview
工厂公开了一种新方法,使用该方法可以创建博客的新实例。
我认为这也是因为实现了JSON过滤器,所以您无法看到所有的值。因为描述、网站和url都在对象的原型中,所以它不会显示它
我添加了一个用于记录模型的按钮,您可以在控制台中看到值已更改
编辑2
Q:我不明白为什么JSON过滤器没有显示值
A: 我认为它可能是如何实现的,可能是让它变得更轻。否则,它必须通过整个原型链
Q:由于博客的性质,为什么将这些值放入proto
A: 这是因为你在博客的原型中添加了值,而不是在博客本身中。这就是javascript中原型继承的工作方式。优势在于,当你必须创建1000个博客实例时,要三思而后行。现在,每个实例都可以具有相同的方法和属性,或者为了使其更轻,每个实例可以共享其原型中的相同对象。(想想OO语言中的基类)阅读此以获得更清晰的
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain
你没有创建一个注入到你的控制器中的博客实例,注入的应该已经是所有将注入到其他人的东西的唯一实例。
因此,服务是单例的(由工厂创建)。
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象