2013-04-23 7 views
5

Sto provando a creare una funzione "mi piace" per la mia app. Voglio essere in grado di impostare il valore di un numero generato dinamicamente come il "mi piace". Il problema arriva usando 'ng-init', poiché la documentazione dice che questo è un brutto modo di farlo!Alternativa all'uso di ng-init in 'vista'?

Come si imposta il valore nel "controller" anziché nella "visualizzazione"?

Ecco quello che ho finora:

<!doctype html> 
<html ng-app="plunker" > 
<head> 
    <meta charset="utf-8"> 
    <title>AngularJS Plunker</title> 
    <script>document.write('<base href="' + document.location + '" />');</script> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script> 
    <script src="app.js"></script> 
</head> 
<body ng-controller="MainCtrl"> 
    <article ng-repeat="feed in feeds"> 
    <h3>{{feed.createdby}}</h3> 
    <p>{{feed.content}}</p> 
    <button ng-click="likeClicked($index)">{{isLiked[$index]|liked}}</button> 
    <span ng-init="likeCount=feed.likes.length">{{likeCount}}</span> 
    </article> 
</body> 
</html> 

Grazie,

JP

risposta

3

Basta cambiare

`<span ng-init="likeCount=feed.likes.length">{{likeCount}}</span>` 

per

`<span>{{feed.likes.length}}</span>`. 

Se è ancora necessario il conteggio nel controller per qualche altro motivo (che non riesco a vedere), creare un controller, supponiamo FeedCtrl, e aggiungerlo alla vostra article:

<article ng-repeat="feed in feeds" ng-controller="FeedCtrl"> 
    ... 
    <span>{{likeCount}}</span> 
</article> 

E la tua FeedCtrl sarebbe:

function FeedCtrl($scope) { 
    $scope.$watch('feed.likes.length', function(newValue) { 
    $scope.likeCount = newValue; 
    }); 
} 

un altro approccio sarebbe creare una funzione per risolvere voi il valore:

<article ng-repeat="feed in feeds" ng-controller="FeedCtrl"> 
    ... 
    <span>{{likeCount()}}</span> 
</article> 
function FeedCtrl($scope) { 
    $scope.likeCount = function() { 
    return $feed && $feed.likes ? $feed.likes.length : undefined; 
    }; 
} 
+0

Grazie per la risposta. Preferisco il secondo approccio, che ho buttato in un Plunker: http://plnkr.co/edit/aHyxJFXVrwIGb27iK45Q?p=preview – JohnRobertPett

+0

Dice che il feed è indefinito ... – JohnRobertPett

+0

Mi dispiace, mio ​​male. È '$ scope.feed'. Fisso. Notare anche il "ritorno" che mi mancava in primo luogo. –

0

Se il feed oggetto/array è lungo, è meglio usare ng-bind per motivi di prestazioni.

<span ng-bind="likeCount"></span> 

piuttosto che

{{likeCount}}