2015-12-17 391 views
1

我有這樣的代碼:排序依據的角/ HTML

<div flex="66"> 
      <h3>{{ hack.title }}</h3> 
      <h4>{{ hack.description }}</h4> 
      <h4>{{ hack.status }}</h4> 
      <p>Backs: {{ hacksCtrl.getBacks(hack.id) }}</p> 
      </div> 

我基本上要由Backs基本上意味着likes訂購,所以更喜歡一些具有較高漲它就會出現在頁面。

所以我這樣做,但它不工作:

ng-repeat="hack in hacksCtrl.hacks | orderBy: hacksCtrl.getBacks()" 

什麼想法?

感謝以下

控制器:

import Chance from 'chance'; 
export default function(hack, $state, $sce, HacksService, user) { 
    const vm = this; 
    vm.hack = hack; 

    vm.trustSrc = function(src) { 
    return $sce.trustAsResourceUrl(src); 
    }; 

    vm.save = function() { 
    HacksService.save(vm.hack); 
    $state.go('hacks.view', { 
     id: vm.hack.id 
    }); 
    }; 

    vm.create = function() { 
    const chance = new Chance(); 

    vm.hack.id = chance.guid(); 
    vm.hack.status = 'proposed'; 
    vm.hack.createdBy = user.name; 
    vm.hack.userProfileImage = user.picture; 
    HacksService.create(vm.hack); 
    $state.go('hacks.view', { 
     id: vm.hack.id 
    }); 
    }; 

    vm.like = function(id, $event) { 
    $event.stopPropagation(); 
    HacksService.like(id, user); 
    }; 
    vm.hasLiked = function() { 
    const userId = user.id; 
    const likes = vm.hack.likes; 

    if (likes) { 
     return (likes.indexOf(userId) !== -1); 
    } 
    }; 
    vm.getLikes = function() { 
    return (vm.hack.likes) ? vm.hack.likes.length : 0; 
    }; 

    vm.isCreate = function() { 
    return !vm.hack; 
    }; 

    vm.goToEdit = function(id) { 
    $state.go('hacks.edit', { 
     id: id 
    }); 
    }; 
} 
+0

把一個變量您的作用域具有hacksCtrl.getBacks(hack.id),並嘗試使用範圍變量 – Manticore

+0

排序,爲什麼'orderBy:hack.title'不按字母順序排序? –

+1

請顯示控制器腳本 –

回答

0

它不工作,因爲,as stated in the Angular Documentation,排序依據預計其參數是一個:

  • function:吸氣功能。此功能的結果將使用<,===,>運算符進行排序。

  • string:一個角度表達式。此表達式的結果用於比較元素(例如,名稱可以通過名爲name的屬性或名稱.substr(0,3)進行排序,以按名稱的屬性的3個第一個字符進行排序)。常量表達式的結果被解釋爲用於比較的屬性名稱(例如,用特殊名稱屬性的值對對象進行排序的「特殊名稱」)。表達式可以選擇以+或 - 作爲前綴,以控制升序或降序排序(例如+名稱或名稱)。如果沒有提供屬性(例如'+'),則使用數組元素本身來比較排序的位置。

  • Array:函數或字符串謂詞的數組。數組中的第一個謂詞用於排序,但是當兩個項目相同時,將使用下一個謂詞。

hackCtrls.getBack(hack.id)是以上皆非。

因此,要解決你的問題,你可以通過回調來排序依據,而不是或綁定一個「喜歡」財產上的黑客和排序屬性名稱:

  1. ng-repeat="hack in hacksCtrl.hacks | orderBy: hacksCtrl.getBacks",並修改getBacks將是:

    vm.getBacks = function(hack) { 
        return hack.backers ? hack.backers.length : 0; 
    } 
    

    這是必要的vm.hacks = [/* multiple hacks */]

  2. ng-repeat="hack in hacksCtrl.hacks | orderBy: 'likes',假定黑客有噸他like財產。

+0

確定是有道理的,我試過你的兩個解決方案,但似乎都沒有工作? –

+0

因爲getback必須要有一個參數(黑客),現在getBacks只是看一個黑客?你有沒有一組他們?爲什麼他們沒有在控制器中定義? – charlespwd

+0

這不是我的代碼,所以我不太確定。所以我應該設置什麼才能使其成爲一個數組,因此能夠對它進行排序? –

1

您的getBacks函數缺少id參數。

編輯:檢查getBacks函數,並檢查它返回的值是否是您所期望的值。如果您單獨獲取數據,我不確定您的代碼。

1

爲了您的功能,通過在整個黑客對象,然後只是名稱的排序依據語句的函數

vm.getBacks = function(hack) { 
    return (hack.backers) ? hack.backers.length : 0; 
}; 

你的角度重複會是這個樣子:

ng-repeat="hack in hacksCtrl.hacks | orderBy: hacksCtrl.getBacks" 
+0

試過這個,似乎沒有工作,代碼已被其他人更改,所以我會重新發布我現在擁有的 –

+0

我沒有在控制器中看到「getBacks」函數。我錯過了嗎? – birwin

+0

它變成了getLikes –