搜尋

首頁  >  問答  >  主體

angular.js - Angular雙向綁定失效了!

先貼上程式碼:

controller:

.controller('FoldController', ['$scope', function ($scope){
    $scope.isFolded = true;   //  标志是否折叠的状态
}])

directive:

.directive('fold', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {

            // 只要点击其中的内容,让其折叠回去
            element.on('click',function () {  
                scope.isFolded = true;
                element.slideUp();
                console.log(scope);             
            });

            // 折叠的函数                
            function toggleFold(isFold) {

                isFold ? element.slideUp() : element.slideDown();
            }       

            // 监视是否折叠,即controller里定义的标志
            scope.$watch(attrs.fold, function (isFold) {
                toggleFold(isFold);
            });
        }
    }
})

html:

<nav class="navbar navbar-default" ng-controller="FoldController">
    <p class="container">
        <p class="navbar-header">
            <button type="button" class="navbar-toggle"
             ng-click="isFolded=!isFolded">  
            //  主要是这里  点击后toggle折叠的标志

                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>

            <a href="#/index" class="navbar-brand">Index {{isFolded}}</a>
                                          // 为了方便测试,我将折叠表示显示出来
        </p>
                                           // 这里用directive控制
        <p class="navbar-collapse collapse" fold="isFolded">
            <ul class="navbar-nav nav">
                <li class="active"><a href="#/index">index</a></li>
                <li><a href="#/about">about</a></li>
                <li><a href="#/contact">contact</a></li>
                <li><a href="#/chatroom">chatroom</a></li>
            </ul>
        </p>

    </p>
</nav>  

效果:

折疊時

未折疊時

前提交代完畢,我的期望是:

在未折疊時透過點擊折疊區域,讓其折疊回去,同時改變scope.isFold折疊標誌,讓其恢復原狀,

問題是:

其中會有一個bug,就是我修改了scope.isFold的值,並且驗證了scope的值是被改變的,但是頁面上依然是原值,即雙向綁定失效,看下圖

從圖上的顯示看,折疊區域已經被折疊,下面輸出的scope.isFold也是正常的true,但是頁面頂端上的值卻是false,我驗證過dom元素,是對了,驗證過controller和directive裡的scope.isFold的值,是對了,唯獨這個頁面就是對的,這個情況發生的也沒有規律,挺鬱悶的,誰來給看看。 。 。

伊谢尔伦伊谢尔伦2824 天前958

全部回覆(4)我來回復

  • phpcn_u1582

    phpcn_u15822017-05-15 16:54:42

    在你的事件處理函數中 加入 $scope.$apply

    回覆
    0
  • PHP中文网

    PHP中文网2017-05-15 16:54:42

    雷雷

    js

    雷雷

    回覆
    0
  • 为情所困

    为情所困2017-05-15 16:54:42

    解決方案是:

    在操作完dom元素,修改scope上的屬性值後,scope.$apply更新視圖

    element.on('click', function() {
        pe.isFolded = !scope.isFolded;          
        element.slideUp();
        scope.$apply();
    })
    

    回覆
    0
  • 黄舟

    黄舟2017-05-15 16:54:42

    其實很多人有個誤區, 就是還在link函數中使用 elemnet.on 這種事件監聽,
    為什麼不用ngClick然後在link中寫一個scope.click函數呢?

    除非你用的第三方的jQuery插件

    回覆
    0
  • 取消回覆