我在控制器之间共享数据时出现问题,我使用了一项服务,看起来很有效,但有些事情并没有发挥作用。
我的问题是: 当我单击一行(在ng-repeat部分中)时,它会正确激活服务函数(ui_mgmt),但它不会更新ui_controller(控制器)$ scope.show_details var!
JS代码
ui_service_f = function() {
//Service which should update Controller 1 var
this.show_details = "-1";
this.ui_mgmt = function(det,data) {
this.show_details = 1;
};
};
ui_controller =function($scope,ui_service) {
//Controller1
//I think this part is bugged
$scope.show_details = ui_service.show_details;
$scope.sub_bottom_menu = ui_service.sub_bottom_menu;
};
sim_list_placer =function($scope,service_sim,ui_service) {
//Controller2
$scope.ui_mgmt = function(a,b) {
ui_service.ui_mgmt(a,b);
};
};
HTML
<div ng-controller="sim_list_placer">
<button ng-click="reload_sim_list()">Reload</button>
<table class="td_mc_table">
<thead>
<td>pk</td><td>ICCID</td><td>Operatore</td>
<td>Numero Dati</td><td>PIN</td><td>PUK</td>
<td>Contratto</td><td>Costo</td><td>APN</td><td>Attivazione</td>
</thead>
<tbody>
<tr ng-repeat="sim in sim_list" ng-click="ui_mgmt(1,sim)">
<td>{{ sim.pk }}</td>
<td>{{ sim.sim_iccid }}</td>
<td>{{ sim.sim_operatore }}</td>
<td>{{ sim.sim_ndati }}</td>
<td>{{ sim.sim_pin }}</td>
<td>{{ sim.sim_puk }}</td>
<td>{{ sim.sim_contratto }}</td>
<td>{{ sim.sim_costo }}</td>
<td>{{ sim.sim_apn }}</td>
<td>{{ sim.sim_data_attivazione }}</td>
</tr>
</tbody>
</table>
</div>
<div ng-controller="ui_controller">
{{show_details}}
<div ng-if="show_details==1" class="td_mc_rightbar" >
Dettagli...
<div ng-switch="sub_bottom_menu">
<div ng-switch-when="sim_mgmt">
Blablablabla
</div>
</div>
</div>
</div>
我错过了什么或...... ???
谢谢你的建议:)
安德烈
答案 0 :(得分:2)
当传递show_details时,您传递的是值,而不是指向该对象的指针,因为它是一个简单的对象。向它添加单个图层就可以了。
this.show_details = {value: "-1"};
这是一个小提琴:http://jsfiddle.net/bwdpft1y/
答案 1 :(得分:2)
show_details的初始值正被复制到控制器中,但它没有被更新,因为JavaScript中的数字是按值传递的,而不是通过引用传递的。
由于对象是按引用传递的,因此一个简单的解决方案是将要绑定的值放在对象中:
ui_service_f = function() {
this.options = {
show_details: "-1";
};
};
ui_controller =function($scope,ui_service) {
$scope.options = ui_service.options;
};
然后在你的控制器中:
<div ng-if="options.show_details==1" class="td_mc_rightbar" >
<!-- ... -->
</div>
这是有效的,因为行$scope.options = ui_service.options
在范围中创建了一个引用选项对象,然后在通常的Angular docs中检查更新。