angualrjs控制器执行两次

时间:2017-09-07 02:05:37

标签: javascript html angularjs angular-ui-router anguarjs-digest-cycle

我使用ui-router从导航跳转或从svg页面跳转只是使用相同的控制器,相同的html模型,相同的css文件。主要通过参数来确定数据切换。从导航跳跃是正常的。从svg页面跳转,控制器将执行两次。第一次执行是正常的,但第二次将执行第一次state()。最后,发件人发送的参数会改为第一个值吗? 对不起,我不擅长英语。请查看以下代码。 非常感谢那些能帮助我的人!

这是州()

    //   .state('main.visual_2d_equipdata2', {
    //     url: '/visual/2D/equipdata',
    //     templateUrl: '../views/visual/2D/equipdata.html',
    //     controller: 'Visual2dEquipDataController',
    //     css: '../static/visual/2D/css/equipdata.css',
    //     params: { 'id':2 }
    // })

    //     .state('main.visual_2d_equipdata3', {
    //     url: '/visual/2D/equipdata',
    //     templateUrl: '../views/visual/2D/equipdata.html',
    //     controller: 'Visual2dEquipDataController',
    //     css: '../static/visual/2D/css/equipdata.css',
    //     params: { 'id': 3 }
    // })


    //    .state('main.visual_2d_equipdata4', {
    //     url: '/visual/2D/equipdata',
    //     templateUrl: '../views/visual/2D/equipdata.html',
    //     controller: 'Visual2dEquipDataController',
    //     css: '../static/visual/2D/css/equipdata.css',
    //     params: { 'id': 4  }
    // })
    //       .state('main.visual_2d_equipdata5', {
    //     url: '/visual/2D/equipdata',
    //     templateUrl: '../views/visual/2D/equipdata.html',
    //     controller: 'Visual2dEquipDataController',
    //     css: '../static/visual/2D/css/equipdata.css',
    //     params: { 'id': 5  }
    // })
    //          .state('main.visual_2d_equipdata6', {
    //     url: '/visual/2D/equipdata',
    //     templateUrl: '../views/visual/2D/equipdata.html',
    //     controller: 'Visual2dEquipDataController',
    //     css: '../static/visual/2D/css/equipdata.css',
    //     params: { 'id': 6}
    // })

这是我的导航跳线功能

$scope.jumper = function(sref) {        
$scope.nav_total = false;
    if (sref == "about") {
        $scope.about_window = true;
    } else if (sref == "event") {
        window.open("#/" + sref, target = "_blank");
    } else if (sref == "info") {
        window.open("#/" + sref, target = "_blank");
    } else if (sref == "config") {
        $state.go("main.config.personnel");
    } else {
        sref = sref.replace(/\./g, '_');
        console.log(6666);
        $state.go("main." + sref);
    }
};

这是svg控制器

// switch(parseInt(id)){
    //     case 1:
    //         $state.go("main.visual_2d_equipdata1" );
    //         break;
    //     case 2:
    //          $state.go("main.visual_2d_equipdata2");
    //         break;
    //     case 3:
    //       $state.go("main.visual_2d_equipdata3");
    //         break;
    //     case 4:
    //       $state.go("main.visual_2d_equipdata4");
    //         break;
    //     case 5:
    //        $state.go("main.visual_2d_equipdata5");
    //         break;
    //     case 6:
    //       $state.go("main.visual_2d_equipdata6");
    //         break;
    // }

这是从svg控制器跳转时将执行两次的主要控制器

angular.module('app.con.visual.2d.equipdata', []).controller('Visual2dEquipDataController', ['$scope', '$state', 'EventService', 'Visual2dService',  '$stateParams', function($scope, $state, EventService, Visual2dService, $stateParams) {

$scope.equipNum  = $stateParams.id;
console.log( $stateParams);
console.log(999);

var getIDNumber = function(){
    switch($stateParams.id){
        case 2:
            var equipId = "1.0005";
            break;
        case 1:
            var equipId = "1.0004";
            break;
        case 3:
            var equipId = "1.0004";
            break;
        case 4:
            var equipId = "1.0004";
            break;
        case 5:
            var equipId = "1.0005";
            break;
        case 6:
            var equipId = "1.0004";
            break;
    }
}

// console.log( equipId);

var aircondition = function() {
    $scope.actual_ac = { "access_token": sessionStorage.access_token, "type": "actual_object", "id": [ $scope.equipId ] };
    Visual2dService.data_2d($scope.actual_ac).then(function(res) {
        if (res.errcode == "00000") {

            console.log(res);
            var analog = res.data[0].analog;
            $scope.analogs = new Array();
            for (var i = 0; i < analog.level.length; i++) {
                var item = new Object();
                item["level"] = analog.level[i];
                item["property"] = analog.property[i];
                // item["unit"] = analog.unit[i];
                item["value"] = analog.value[i];
                $scope.analogs.push(item);
            };

            var digit = res.data[0].digit;
            $scope.digits = new Array();
            for (var i = 0; i < digit.level.length; i++) {
                var item = new Object();
                item["level"] = digit.level[i];
                item["property"] = digit.property[i];
                if (digit.level[i] == 0) {
                    item["show"] = "check";
                } else {
                    item["show"] = "exclamation";
                };
                $scope.digits.push(item);
            };
        } else {
            console.info(res.errmsg);
        };
    });
};

var init = function() {
    getIDNumber();

    aircondition();

    // airscreen();

    // setTimeout(init, sessionStorage.reload_timeout);
};
init();   

}]);

请注意

console.log( $stateParams);
console.log(999);

当点击2跳svg页面时会记录 {id:2} 999 {id:1} 999

1 个答案:

答案 0 :(得分:0)

ui-router部分通过将给定的URL解析为特定状态(例如,当您重新加载页面时),因此不建议为不同的状态使用相同的URL。

对于您的情况,如果您不介意在网址中包含id,则状态定义可以大大简化为

.state('main.visual_2d_equipdata', {
    url: '/visual/2D/equipdata/:id',
    templateUrl: '../views/visual/2D/equipdata.html',
    controller: 'Visual2dEquipDataController',
    css: '../static/visual/2D/css/equipdata.css'
})

因此,在目的地,您也可以使用$stateParams.id

导航到此状态时需要进行一些更改

$state.go('main.visual_2d_equipdata', {id:2});

ui-sref="main.visual_2d_equipdata({id:2})"