在我的应用程序中,在某个视图下,我创建了两个指令,dir1
来循环遍历一个对象数组,并dir2
显示额外的信息,点击\选择来自{{1}的内容所以这基本上意味着它们都处于同一水平。 dir1
从视图控制器获取数组并呈现数据。 dir1
假设从dir2
获取数据,而我并不确定这是实现此目标的最佳方法。有几种可能性:
1.选择dir1
时使用dir1
或emit
服务(通过broadcast
?)。
2.使用服务
3.需要父控制器(主视图),从$rootScope
更新它,并以某种方式将对象传递给dir1
。
我尝试使用名为dir2
的{{1}}服务,但我无法触发factory
中的更改,因此我不确定这是一个不错的解决方案。
这是主视图的结构:
serv
dir2
代码:
<div id="container">
<div class="parent">
<dir1 character="person" ng-repeat="person in obj"></dir1>
</div>
<dir2></dir2>
</div>
dir1
代码:
angular.module("app").directive("dir1", function (serv) {
return {
restrict: "E",
templateUrl: "dirs/parent.html",
scope:{
character: "="
},
controller: function ($scope) {
},
link: function (scope,elem, attrs) {
scope.getData = function (data) {
// console.log(data);
serv.setChar(data);
}
}
}
});
dir2
服务代码:
angular.module("app").directive("dir2", function (serv) {
return {
restrict: "E",
templateUrl:"dirs/child.html",
scope:{
obj: "="
},
controller: function () {
console.log("child ctrl")
},
link: function (scope, elem, attrs) {
scope.obj = serv.char;
}
}
});
编辑:我忘了添加serv
模板:
angular.module("app").factory("serv", [function () {
var self = this;
var char = {};
return {
setChar: function (character) {
console.log("char set to: " + character);
self.char = character;
},
getChar: function () {
console.log("returned char: " + self.char);
return self.char;
}
}
}]);<br>
EDIT2:
dir
模板:
<p ng-click="getData(character)">
{{character.name}}
</p>
答案 0 :(得分:1)
我为使用指令做了新答案。
console.log
内的getChar
永远不会执行,因为您从不致电getChar
。哪个好。而是在第二个指令中将scope.obj
设置为serv.char
。问题是,在您工厂中,您不会返回此char
属性。您只需返回setChar
和getChar
个功能。
所以要么从你的工厂返回char
(但这不是很好,因为你直接访问变量,我想你不想),或者link
函数dir2
您创建了一个观察者,如下所示。
scope.$watch(serv.getChar, function(newValue) {
scope.obj = newValue;
});
因此obj
的{{1}}属性会在每次更改时与当前人员进行更新。
答案 1 :(得分:0)
(在你最近的评论中,我明白学习指令比实际用例更多,我道歉)
您的HTML
<div id="container">
<div class="parent">
<div ng-click="selectPerson(person)" ng-repeat="person in obj"></div>
</div>
<div ng-if="selectedPerson != null">
<!-- display whatever you want about the selected person -->
</div>
</div>
在主控制器内
$scope.obj = []; /* this is your existing array of people */
$scope.selectedPerson = null;
$scope.selectPerson = function(person) {
$scope.selectedPerson = person;
}
答案 2 :(得分:0)
下面是一个示例,说明如何扩展当前代码以共享数据,而无需进行额外的服务调用,也无需添加$ watch(这在性能上是昂贵的)。这是我创建的一个示例pen。
angular
.module("app")
.directive("dir2", function() {
return {
restrict: "E",
templateUrl: "dirs/child.html",
scope: {
obj: "="
},
controller: function() {
console.log("child ctrl");
},
link: function(scope, elem, attrs) {
//you should have the right data obj here
// without having to make service call again or put a $watch.
console.log(scope.obj);
}
};
});
<div id="container">
<div class="parent">
<dir1 character="person" ng-repeat="person in obj"></dir1>
</div>
<dir2 obj="obj"></dir2>
</div>