我正在尝试集成JQuery.iCheck(用于checkbox&Radio buttons样式设置的插件)。在这里,我遵循了一些建议,即ngRepeat通过使用集成jQuery插件以与Angular完全兼容的方法directives。
checkbox&Radio buttons
ngRepeat
directives
所以我实现了directive:
directive
webApp.directive('icheck', function($timeout, $parse) { return { link: function($scope, element, $attrs) { return $timeout(function() { var ngModelGetter, value; ngModelGetter = $parse($attrs['ngModel']); value = $parse($attrs['ngValue'])($scope); return $(element).iCheck({ checkboxClass: 'icheckbox_minimal', radioClass: 'iradio_minimal-grey', checkboxClass: 'icheckbox_minimal-grey', increaseArea: '20%' }).on('ifChanged', function(event) { if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) { $scope.$apply(function() { return ngModelGetter.assign($scope, event.target.checked); }); } if ($(element).attr('type') === 'radio' && $attrs['ngModel']) { return $scope.$apply(function() { return ngModelGetter.assign($scope, value); }); } }); }); } }; });
这directive无法与my一起使用ngRepeat elements,并且不会更改的属性object vote。
ngRepeat elements
object
vote
我的代码-Git
我的代码:
var webApp = angular.module('webApp', []); //controllers webApp.controller ('VotesCtrl', function ($scope, Votes) { $scope.votes = Votes; $scope.statuses = ["Approved","Pending","Trash","Spam"]; $scope.selectedID = 1; $scope.expand = function(vote) { console.log("show"); $scope.vote = vote; $scope.selectedID = vote.id; }; $scope.change = function() { for(var i = 0; i < $scope.votes.length; i++) { if($scope.votes[i].cb) { $scope.votes[i].status = $scope.votes.status; $scope.votes[i].cb = false; } $scope.show = false; } }; }); //services webApp.factory('Votes', [function() { //temporary repository till integration with DB this will be translated into restful get query var votes = [ { id: '1', created: 1381583344653, updated: '222212', ratingID: '3', rate: 5, ip: '198.168.0.0', status: 'Pending', userIdentification:'IP-ADDRESS' }, { id: '111', created: 1381583344653, updated: '222212', ratingID: '4', rate: 5, ip: '198.168.0.1', status: 'Spam', userIdentification:'FLASH-COOKIES' }, { id: '2', created: 1382387322693, updated: '222212', ratingID: '3', rate: 1, ip: '198.168.0.2', status: 'Approved', userIdentification:'HTTP-COOKIES' }, { id: '4', created: 1382387322693, updated: '222212', ratingID: '3', rate: 1, ip: '198.168.0.3', status: 'Spam', userIdentification:'IP-ADDRESS' } ]; return votes; }]); webApp.directive('icheck', function($timeout, $parse) { return { link: function($scope, element, $attrs) { return $timeout(function() { var ngModelGetter, value; ngModelGetter = $parse($attrs['ngModel']); value = $parse($attrs['ngValue'])($scope); return $(element).iCheck({ checkboxClass: 'icheckbox_minimal', radioClass: 'iradio_minimal-grey', checkboxClass: 'icheckbox_minimal-grey', increaseArea: '20%' }).on('ifChanged', function(event) { if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) { $scope.$apply(function() { return ngModelGetter.assign($scope, event.target.checked); }); } if ($(element).attr('type') === 'radio' && $attrs['ngModel']) { return $scope.$apply(function() { return ngModelGetter.assign($scope, value); }); } }); }); } }; });
我的HTML:
<body ng-controller="VotesCtrl"> <div> <ul> <li class="check" ng-click=""> <input type="checkbox" ng-model="master" /> </li> <li class="created"> <a>CREATED</a> </li> <li class="ip"> <b>IP ADDRESS</b> </li> <li class="status"> <b>STATUS</b> </li> </ul> <ul ng-repeat="vote in votes"> <li class="check"> <input type="checkbox" ng-model="vote.cb" ng-checked="master" /> </li> <li class="created" ng-class="{selected: vote.id == selectedID}"> <a href="#" ng-click="expand(vote)">{{vote.created|date}}</a> </li> <li class="ip"> {{vote.ip}} </li> <li class="status"> {{vote.status}} </li> </ul> </div> <br /> <br /> <div class="details" ng-init="expand(votes[0])"> <h3>Details:</h3> <div>DATE: {{vote.created | date}}</div> <div>IP: {{vote.ip}}</div> <div > Cookies: <div> <input icheck type="radio" ng-model="vote.userIdentification" name="iCheck" value="FLASH-COOKIES" /> <span>FLASH COOKIES</span> </div> <div> <input icheck type="radio" ng-model="vote.userIdentification" name="iCheck" value="HTTP-COOKIES" /> <span>HTTP COOKIES</span> </div> <div> <input icheck type="radio" ng-model="vote.userIdentification" name="iCheck" value="IP-ADDRESS" /> <span>IP ADDRESS</span> </div> </div> </div> </body>
已经解决了此链接:https://github.com/fronteed/iCheck/issues/62由wajatimur
webApp.directive('icheck', function($timeout, $parse) { return { require: 'ngModel', link: function($scope, element, $attrs, ngModel) { return $timeout(function() { var value; value = $attrs['value']; $scope.$watch($attrs['ngModel'], function(newValue){ $(element).iCheck('update'); }) return $(element).iCheck({ checkboxClass: 'icheckbox_flat-aero', radioClass: 'iradio_flat-aero' }).on('ifChanged', function(event) { if ($(element).attr('type') === 'checkbox' && $attrs['ngModel']) { $scope.$apply(function() { return ngModel.$setViewValue(event.target.checked); }); } if ($(element).attr('type') === 'radio' && $attrs['ngModel']) { return $scope.$apply(function() { return ngModel.$setViewValue(value); }); } }); }); } }; });