AngularJS - 在两个控制器之间共享数据,有什么不对?

时间:2015-12-01 07:15:06

标签: javascript angularjs

我在控制器之间共享数据时出现问题,我使用了一项服务,看起来很有效,但有些事情并没有发挥作用。

我的问题是: 当我单击一行(在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>

我错过了什么或...... ???

谢谢你的建议:)

安德烈

2 个答案:

答案 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中检查更新。