1

我有一個指令,應該允許我更改特定的模式,並更新範圍。如果條件爲真,則隱藏元素

這工作正常。

我現在面臨的問題是我需要能夠隱藏當前模式的元素。

我會更好地解釋它:

我有模式陣列:

[1,2,3,4,5] 

和NG-中繼器裏面的一些鏈接:

<a href="" 
    ng-repeat="m in zoneModes" 
    ng-click="changeZoneMode({{m}})" 
    id="{{m}}" 
    class="menu-item"> 
    <i class="icon-mode-{{m}}"></i> 
</a> 

什麼,我要做的就是躲元素如果selectedZone不等於m:

ng-if="selectedMode!=m" 

接縫像一切都很好,但事實並非如此。

你可以清楚地看到什麼是從this live example

基本問題,每次的條件是滿足,它移除元素,從來沒有把它放回去。

我也試圖與NG-秀,但結果也不好,因爲它留下的空白點(你可以檢查this other example

有什麼建議?由於

編輯

試圖使用過濾器的建議,但沒有運氣:

.directive('mySelector', function() { 
    var changeMode, linkFunction; 

    changeMode = function(newmode) { 
    var $scope; 
    $scope = this.$parent; 
    $scope.selectedMode = newmode; 
    $('.menu-open').attr('checked', false); 
    }; 
    linkFunction = function(scope, element, attrs) { 
    scope.changeMode = changeMode; 
    scope.changeZoneMode = changeMode; 
    scope.zoneModes = [1, 2, 3, 4, 5]; 

    return scope.$watch((function() { 
     return scope.selectedMode; 
    }), function(newMode) { 
     return scope.selectedMode = newMode; 
    }); 
    }; 

    return { 
    restrict: 'E', 
    scope: { 
     selectedMode: '=currentmode', 
     id: '@id' 
    }, 
    replace: true, 
    templateUrl: 'templates/template.html', 
    link: linkFunction, 
    controller: 'abc' 
    }; 
}).controller('abc', ['$scope', function($scope) { 
    $scope.checkM = function (mode, m) { 
    return mode == m; 
    }; 
}]) 

template.html

<a href="" 
    ng-repeat="m in zoneModes|filter:checkM(selectedMode,m)" 
    ng-click="changeZoneMode({{m}})" 
    id="{{m}}" 
    class="menu-item"> 
    <i class="icon-mode-{{m}}"></i> 
</a> 

回答

0

最後,我管理這個使用過濾器,和這裏的最終代碼來解決:

angular.module('App', ['ionic']) 

.controller('ctrl', ['$scope', function($scope) { 
    $scope.current = { 
    'id': 0, 
    'mode': 1 
    } 
}]) 

.directive('mySelector', function() { 
    var changeMode, linkFunction; 

    changeMode = function(newmode) { 
    var $scope; 
    $scope = this.$parent; 
    $scope.selectedMode = newmode; 
    $('.menu-open').attr('checked', false); 
    }; 

    linkFunction = function(scope, element, attrs) { 
    scope.changeMode = changeMode; 
    scope.changeZoneMode = changeMode; 
    scope.zoneModes = [1, 2, 3, 4, 5]; 

    return scope.$watch((function() { 
     return scope.selectedMode; 
    }), function(newMode) { 
     return scope.selectedMode = newMode; 
    }); 
    }; 

    return { 
    restrict: 'E', 
    scope: { 
     selectedMode: '=currentmode', 
     id: '@id' 
    }, 
    replace: true, 
    templateUrl: 'templates/template.html', 
    link: linkFunction, 
    }; 
}) 

.filter('abc', function() { 
     return function(m, sel) { 
      console.log('abc',arguments); 
      var filteredModes = []; 
      angular.forEach(m, function(mode) { 
      if(sel != mode) { 
       filteredModes.push(mode); 
      } 
      }); 
      return filteredModes; 
     } 
    }); 

它現在按預期工作。

0

我可能不太懂問題,但是ng-if="selectedMode!='m'"給你你想要的結果?

+0

除了當我改變模式(例如從1到2),我不想要顯示2,但我想要1被添加...基本上應該總是有4個圖標(四種不同的模式),但缺少的應該是選擇的 – Nick

+0

如果我選擇Facebook,我想能夠看到twitter,twich,vine和vk,如果我選擇twitter,我想能夠看facebook,twich,vine,vk等。 – Nick

+0

我試過了Jordan.JD的解決方案,我想這正是你想要的。 –

1

您是否試過在您的ng-repeat上使用filter?如果你使用過濾器,你的元素不會丟失,改變m的值會再次顯示它。嘗試是這樣的:

ng-repeat="m in zoneModes|filter:checkM(selectedMode,m)" 

然後在你的控制器,你需要做一個過濾器:

$scope.checkM = function (mode, m) { 
    return mode == m; 
}; 
+0

如果你使用這種方法,你需要再次移除你的'ng-if'。 –

+0

我試圖使用過濾器,但沒有運氣 請參閱編輯的問題 – Nick

+0

@Nick,是否可以對它進行演示,以便我編輯? 'checkM'函數可能必須返回一個函數返回模式== m –