Model and Controller:
function TestController($scope) { // Models $scope.messages = [ { Message: 'Life is what happens to you...', By: 'John Lennon' }, { Message: 'If you can\'t explain...', By: 'Albert Einstein' }, { Message: 'The answer to life...', By: 'Douglas Adams' } ]; $scope.currentMessage = null; // Controller's actions $scope.setCurrentMessage = function(msg) { $scope.currentMessage = msg; }; $scope.isCurrentMessage = function(msg) { return msg == $scope.currentMessage; }; $scope.addMessage = function() { var msg = {Message: 'blah', By: 'Anonymous'}; $scope.currentMessage = msg; $scope.messages.push(msg); }; } var appGreat = angular.module('AppGreat', []); appGreat.directive('toFocus', function ($timeout) { return function (scope, elem, attrs) { scope.$watch(attrs.toFocus, function (newval) { if (newval) { $timeout(function () { elem[0].focus(); }, 0, false); } }); }; });
View:
<br/> <div ng-app='AppGreat' ng-controller='TestController'> <table> <thead> <tr> <th>Message</th><th>By</th> </tr> </thead> <tbody> <tr ng-repeat='m in messages'> <td width='200px'> <div ng-hide='isCurrentMessage(m)' ng-click='setCurrentMessage(m)'> {{m.Message}} </div> <div ng-show='isCurrentMessage(m)'> <input ng-model='m.Message' to-focus='isCurrentMessage(m)' style='width: 100%' /> </div> </td> <td> <div ng-hide='isCurrentMessage(m)' ng-click='setCurrentMessage(m)'> {{m.By}} </div> <div ng-show='isCurrentMessage(m)'> <input ng-model='m.By'/> </div> </td> </tr> </tbody> </table> <input type='button' ng-click='addMessage()' value='Add Message'/> </div>
Excellent! I'm not trying to do anything very similar, but this seems like a clean way to handle focus. Very educational.
ReplyDelete