鍍金池/ 問(wèn)答/HTML/ angular1.x directive通信問(wèn)題

angular1.x directive通信問(wèn)題

在angular 1.x版本中使用directive,代碼如下
// directive

module.directive('rankChart', function() {
    return {
        scope: {
            id: "@",
            rankItem: "=",
            rankData: "=",
            reloadChartData: "=rankreload"
        },
        restrict: 'E',
        template: '<div>{{rankData[0].showHand}}</div>',
        replace: true,
        controller: function($scope) {
            var loadRankChartData = function() {
            var option = {
                    grid: {
                        x: 50,
                        x2: 50,
                        y: 0,
                        y2: 0,
                        height: $scope.rankItem.length * 40
                    },
                    xAxis: {
                        type : 'value',
                        axisLine: {show: false},
                        axisLabel: {show: false},
                        axisTick: {show: false},
                        splitLine: {show: false}
                    },
                    yAxis: {
                        type : 'category',
                        axisTick: {show: false},
                        data : $scope.rankItem
                    },
                    series : [
                        {
                            name:'貢獻(xiàn)值',
                            type:'bar',
                            stack: '排名',
                            barWidth: 16,
                            itemStyle: {
                                normal: {
                                    color: '#3F9AE9'
                                }
                            },
                            label: {
                                normal: {
                                    color:'#333333',
                                    show: true,
                                    position: 'right'
                                }
                            },
                            data:$scope.rankData
                        }
                    ]
                };


                var myChart = echarts.init(document.getElementById($scope.id));
                myChart.clear();
                myChart.setOption(option);
                myChart.on('click',function (param) {
                    console.log(param)
                    dataIndex = param.dataIndex
                    angular.forEach($scope.rankData,function (item) {
                        item.showHand = false
                    });
                    $scope.rankData[dataIndex].showHand = true

                    console.log($scope.rankData)
                })

            }

            // 對(duì)外接口
            $scope.reloadChartData = function() {
                loadRankChartData();
            }


        }

    };
});


html


 <rank-chart id="rankChart" rank-data="rankData" rank-item="rankItem"
                                                    style="width:400px;"  ng-style="{'height': !rankData.length?'80px' : rankData.length * 40 + 'px'}"   rankreload="rankreload"></rank-chart>
                                                    

controller

$scope.rankData = []
$scope.rankItem = []

請(qǐng)求后--
$scope.rankData = [{value: 22,sid:22, rank: 1,showHand:false}]
$scope.rankItem = ['name']
$scope.rankreload($scope.rankItem, $scope.rankdata);

這里使用的echart,想在點(diǎn)擊之后改變它的屬性,改了之后在directive里能打印出來(lái),showHand為ture,但是controller里或者說(shuō)頁(yè)面的值并沒(méi)有發(fā)生變化,看過(guò)文檔 說(shuō) '=' 是雙向綁定,不知道為什么controller的值沒(méi)有改變呢?

回答
編輯回答
糖豆豆

因?yàn)槟阌昧薳chart中的click事件,而不是ng1自帶的ng-click事件,沒(méi)有辦法觸發(fā)ng1本身的臟檢查,而ng1本身的雙向數(shù)據(jù)綁定依賴的就是臟檢查機(jī)制,因此視圖上沒(méi)有得到更新。
解決辦法就是手動(dòng)觸發(fā)數(shù)據(jù)模型的檢查,也就是$scope.$apply()。

2018年3月26日 19:49
編輯回答
礙你眼

調(diào)用下$scope.$apply()

2017年1月3日 04:06