2016-07-26 66 views
0

我想在另一個指令中使用lazyLoad指令。問題是我無法弄清楚如何在Controller中調用'loadMore'函數,因爲它永遠不會觸發。嵌套指令中的鏈接函數的呼叫控制器函數

這裏是主指令:

angular.module('ssq.shared').directive('checkboxPicklist', function() { 
    return { 
     restrict: 'E', 
     templateUrl: '/SSQV4/SSQV5/Scripts/app/Shared/directives/checkboxPicklist.html', 
     replace: true, 
     scope: { 
      itemId: '=', 
      list: '=', 
      nameProp: '=', 
      title: '@', 
      searchPlaceholder: '@', 
      callbackFn: '&' 
     }, 
     link: function (scope, element, attrs) { 
      scope.query = ''; 

      var child = element.find('.dropdown-menu'); 
      child.on({ 
       'click': function(e) { 
        e.stopPropagation(); 
       } 
      }); 

      var selectedItemFn = function (item) { 
       return item.selected; 
      }; 

      scope.getSelectedCount = function() { 
       return _.filter(scope.list, selectedItemFn).length; 
      }; 

      scope.allSelected = function(list) { 
       var newValue = !scope.allNeedsMet(list); 
       _.each(list, function(item) { 
        item.selected = newValue; 
        scope.callbackFn({ object: item }); 
       }); 
      }; 

      scope.allNeedsMet = function(list) { 

       var needsMet = _.reduce(list, function(memo, item) { 
        return memo + (item.selected ? 1 : 0); 
       }, 0); 
       if (!list) { 
        return (needsMet === 0); 
       } 
       return (needsMet === list.length); 
      }; 
     } 
    }; 
}); 

})();

這裏是lazyLoad指令:

app.directive('lazyLoad', function() { 
return { 
    restrict: 'A', 
    scope: { 'loadMore': '&' }, 
    link: function (scope, elem) { 
     var scroller = elem[0] 
     $(scroller).bind('scroll', function() { 
      if (scroller.scrollTop + scroller.offsetHeight >= scroller.scrollHeight) { 
       scope.$apply('loadMore()') 
      } 
     }) 
    } 
} 

});

這裏是我的控制器功能:

$scope.loadMore = function() { 
    indServices = indServices + 10 
    var r = 10 
    if (ind + 10 >= $scope.buffer.Services.length) { 
     r = $scope.buffer.Services.length - ind 
    } 

} 

這裏是我的HTML:

<div class="pec-checkbox-picklist btn-group btn-group-picklist"> 
<button id="{{itemId}}" class="form-control dropdown-toggle" data-toggle="dropdown"> 
    <span class="cbpl-btn-text">{{ getSelectedCount() }} {{ title }}</span><span class="caret"></span> 

</button> 
<ul class="dropdown-menu dropdown-menu-complex" data-complex-menu style="overflow-y: scroll" lazy-load> 

    <li class="list-group-item search-item"> 
     <input class="form-control" type="text" placeholder="{{ searchPlaceholder }}" ng-model="query" /> 
     <button type="button" class="btn btn-small" ng-show="query" ng-click="query = undefined">clear</button> 
    </li> 
    <li class="divider" ng-hide="query"></li> 
    <li class="list-group-item" ng-hide="query"> 
     <label class="checkbox"> 
      <input type="checkbox" ng-click="allSelected(list)" ng-checked="allNeedsMet(list)"> 
      Select All 
     </label> 
    </li> 
    <li class="divider"></li> 
    <li class="list-group-item" ng-repeat="item in list | searchFilter:nameProp:query"> 
     <label class="checkbox" title="{{ item[nameProp] }}"> 
      <input type="checkbox" ng-model="item.selected" ng-change="callbackFn({object: item})"> 
      {{ item[nameProp] }} 
     </label> 
    </li> 

</ul> 

當lazyLoad指令命中scope.$apply('loadMore())它從來沒有執行相應的功能,因爲它看到了其他指令「checkboxPicklist」作爲父範圍。任何援助非常感謝!

回答

0

這需要更改父指令js文件,父指令html文件和父級html頁面。在父指令的html模板中,我必須使用lazyload指令添加load-more="loadMore()"。所以它看起來像這樣:

<div class="pec-checkbox-picklist btn-group btn-group-picklist"> 
    <button id="{{itemId}}" class="form-control dropdown-toggle" data-toggle="dropdown"> 
     <span class="cbpl-btn-text">{{ getSelectedCount() }} {{ title }}</span><span class="caret"></span> 

    </button> 
    <ul class="dropdown-menu dropdown-menu-complex" data-complex-menu style="overflow-y: scroll" lazy-load load- 

more="loadMore()"> 
     <li class="list-group-item search-item"> 
      <input class="form-control" type="text" placeholder="{{ searchPlaceholder }}" ng-model="query" /> 
      <button type="button" class="btn btn-small" ng-show="query" ng-click="query = undefined">clear</button> 
     </li> 
     <li class="divider" ng-hide="query"></li> 
     <li class="list-group-item" ng-hide="query"> 
      <label class="checkbox"> 
       <input type="checkbox" ng-click="allSelected(list)" ng-checked="allNeedsMet(list)"> 
       Select All 
      </label> 
     </li> 
     <li class="divider"></li> 
     <li class="list-group-item" ng-repeat="item in list | searchFilter:nameProp:query"> 
      <label class="checkbox" title="{{ item[nameProp] }}"> 
       <input type="checkbox" ng-model="item.selected" ng-change="callbackFn({object: item})"> 
       {{ item[nameProp] }} 
      </label> 
     </li> 
    </ul> 
</div> 

但是,調用loadMore()這裏只是切換範圍父指令。它仍然沒有打到主控制器的功能。所以,它,然後我不得不添加call-More()

scope: { 
     itemId: '=', 
     list: '=', 
     nameProp: '=', 
     title: '@', 
     searchPlaceholder: '@', 
     callbackFn: '&', 
     callMore: '&' 
    }, 
      scope.loadMore = function() { 
      scope.callMore(); 
     }; 

然後在使用該指令的HTML頁面時,我不得不添加call-more="loadMore()"真正終於在我的主控制器命中$scope.loadMore功能。由於該指令是重複的,我有一個特定的loadMore()添加到如下每個選擇列表:

scope.loadMoreServices = function() { 
     indServices = indServices + 10; 
     var r = 10; 
     if (indServices + 10 >= $scope.buffer.Services.length) { 
      r = $scope.buffer.Services.length - indServices; 
     } 
     $scope.services = $scope.services.concat($scope.buffer.Services.slice(indServices, r + indServices)); 
    }; 
    $scope.loadMoreAreas = function() { 
     indAreas = indAreas + 10; 
     var r = 10; 
     if (indAreas + 10 >= $scope.buffer.Areas.length) { 
      r = $scope.buffer.Areas.length = indAreas; 
     } 
     $scope.areas = $scope.areas.concat($scope.buffer.Areas.slice(indAreas, r + indAreas)); 
    }; 
    $scope.loadMoreVerifications = function() { 
     indVerifications = indVerifications + 10; 
     var r = 10; 
     if (indVerifications + 10 >= $scope.buffer.Verifications.length) { 
      r = $scope.buffer.Verifications.length = indVerifications; 
     } 
     $scope.verifications = $scope.verifications.concat($scope.buffer.Verifications.slice(indVerifications, r + 

indVerifications)); 
    }; 
    $scope.loadMoreSubscriptions = function() { 
     indSubscriptions = indSubscriptions + 10; 
     var r = 10; 
     if (indSubscriptions + 10 >= $scope.buffer.Subscriptions.length) { 
      r = $scope.buffer.Subscriptions.length = indSubscriptions; 
     } 
     $scope.subscriptions = $scope.subscriptions.concat($scope.buffer.Subscriptions.slice(indSubscriptions, r + 

indSubscriptions)); 
    }; 

    $scope.$watch('buffer', function() { 
     indServices = 0; 
     indAreas = 0; 
     indVerifications = 0; 
     indSubscriptions = 0; 
     $scope.services = $scope.buffer.Services.slice(0, 10); 
     $scope.areas = $scope.buffer.Areas.slice(0, 10); 
     $scope.verifications = $scope.buffer.Verifications.slice(0, 10); 
     $scope.subscriptions = $scope.buffer.Subscriptions.slice(0, 10); 
    }); 

主頁上完成的HTML:

<checkbox-picklist data-item-id="'servicesPicklist'" 
                 data-search-placeholder="Search Services" 
                 data-list="services" 
                 data-title="Service(s)" 
                 data-name-prop="'vchDescription'" 
                 data-callback-fn="addService(object)" 
                 call-more="loadMoreServices()"> 

            </checkbox-picklist> 
           </div> 
           <div class="col-sm-6 col-md-6 col-lg-3"> 
            <checkbox-picklist data-item-id="'areasPicklist'" 
                 data-search-placeholder="Search Areas" 
                 data-list="areas" 
                 data-title="State(s)/Province(s)" 
                 data-name-prop="'vchStateLongName'" 
                 data-callback-fn="addArea(object)" 
                 call-more="loadMoreAreas()"> 
            </checkbox-picklist> 
           </div> 
           <div class="col-sm-6 col-md-6 col-lg-3"> 
            <checkbox-picklist data-item-id="'verificationsPicklist'" 
                 data-search-placeholder="Search Verifications" 
                 data-list="verifications" 
                 data-title="Verification(s)" 
                 data-name-prop="'vchDescription'" 
                 data-callback-fn="addVerification(object)" 
                 call-more="loadMoreVerifications()"> 
            </checkbox-picklist> 
           </div> 
           <div class="col-sm-6 col-md-6 col-lg-3"> 
            <checkbox-picklist data-item-id="'subscriptionsPicklist'" 
                 data-search-placeholder="Search Subscriptions" 
                 data-list="subscriptions" 
                 data-title="Subscription(s)" 
                 data-name-prop="'vchDescription'" 
                 data-callback-fn="addSubscription(object)" 
                 call-more="loadMoreSubscriptions()"> 
            </checkbox-picklist> 

感謝Estus,因爲你的反應幫助把我放在正確的道路上。我希望我解釋得很好,可以幫助別人。快樂的編碼!

1

lazy-load指令沒有load-more屬性。父範圍的方法不會傳遞給它。它應該與

<... lazy-load load-more="loadMore()"> 
相關問題