2012-12-28 37 views
15

Có cách nào rõ ràng hơn là ủy quyền lấy nét cho một phần tử khi hộp kiểm được nhấp hay không. Dưới đây là phiên bản bẩn tôi bị tấn công:AngularJS - Tập trung vào yếu tố đầu vào khi một hộp kiểm được nhấp vào

HTML

<div ng-controller="MyCtrl"> 
    <input type="checkbox" ng-change="toggled()"> 
    <input id="name"> 
</div> 

Javascript

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope, $timeout) { 
    $scope.value = "Something"; 
    $scope.toggled = function() { 
     console.debug('toggled'); 
     $timeout(function() { 
      $('#name').focus(); 
     }, 100); 
    } 
} 

JSFiddle: http://jsfiddle.net/U4jvE/8/

+0

Giá trị trì hoãn bằng 0 (thay vì 100) cũng sẽ hoạt động. –

Trả lời

17

thế nào về việc này? plunker

$scope.$watch('isChecked', function(newV){ 
     newV && $('#name').focus(); 
    },true); 

@asgoth và @Mark Rajcok là chính xác. Chúng ta nên sử dụng chỉ thị. Tôi chỉ lười biếng.

Đây là phiên bản chỉ thị. plunker Tôi nghĩ rằng một lý do chính đáng để làm cho nó như là chỉ thị là bạn có thể tái sử dụng điều này.

như vậy trong html của bạn, bạn chỉ có thể gán modals khác nhau để bộ khác nhau

<input type="checkbox" ng-model="isCheckedN"> 
<input xng-focus='isCheckedN'> 


directive('xngFocus', function() { 
    return function(scope, element, attrs) { 
     scope.$watch(attrs.xngFocus, 
     function (newValue) { 
      newValue && element.focus(); 
     },true); 
     };  
}); 
0

Một cách sạch hơn là sử dụng một chỉ thị để thực hiện chuyển đổi:

app.directive('toggle', function() { 
    return { 
     restrict: 'A', 
     scope: { 
     selector: '=' 
     }, 
     link: function(scope, element, attrs) { 
      element.on('change', function() { 
       $(scope.selector).focus(); 
       scope.$apply(); 
      }); 
     } 
    }: 
}); 

html của bạn sẽ được sth thích :

<input type='checkbox' toggle selector='#name'> 
+0

Điều gì xảy ra nếu bộ chọn không phải là duy nhất trên trang? Trong trường hợp này, tôi sẽ có nhiều '.name' nhưng chỉ một trong số chúng khớp với phạm vi hiện tại. – kolrie

7

Thực hiện chỉ thị khác (không yêu cầu jQuery) và vay một số mã @ maxisam của:

myApp.directive('focus', function() { 
    return function(scope, element) { 
     scope.$watch('focusCheckbox', 
     function (newValue) { 
      newValue && element[0].focus() 
     }) 
    }  
}); 

HTML:

<input type="checkbox" ng-model="focusCheckbox"> 
<input ng-model="name" focus> 

Fiddle.

Vì chỉ thị này không tạo ra một phạm vi cô lập (hoặc phạm vi con), chỉ thị giả định phạm vi có một thuộc tính được xác định là focusCheckbox.

+0

@maxisam, tôi thích thuộc tính bạn đã thêm vào câu trả lời của mình. BTW, không element.focus() làm việc cho bạn? Tôi đã phải sử dụng phần tử [0] .focus(). –

+0

Tôi quên bạn đang bao gồm jQuery, vì vậy đó là lý do tại sao element.focus() hoạt động. Nếu jQuery không được bao gồm, chúng ta phải sử dụng phần tử [0] .focus() để thay thế. –

5

Nếu bạn muốn làm cho nó thú vị hơn, và hỗ trợ cho bất kỳ biểu hiện được đánh giá (không chỉ biến), bạn có thể làm điều này:

app.directive('autofocusWhen', function ($timeout) { 
    return { 
     link: function(scope, element, attrs) { 
      scope.$watch(attrs.autofocusWhen, function(newValue){ 
       if (newValue) { 
        $timeout(function(){ 
         element.focus(); 
        }); 
       } 
      }); 
     } 
    }; 
}); 

Và html của bạn có thể là một chút tách riêng hơn, như rằng:

<input type="checkbox" ng-model="product.selected" /> 
{{product.description}} 
<input type="text" autofocus-when="product.selected" /> 
+1

Tại sao bạn sử dụng dịch vụ $ timeout? – Alpha

+1

@Alpha, vì một số lý do, trong AngularJS, '$ watch' biểu thức xảy ra trước khi vẽ lại html, do đó, một cuộc gọi ngay lập tức đến' phần tử.focus(); 'sẽ tập trung phần tử và ngay lập tức mất tiêu điểm, khi phạm vi thay đổi và phần tử được vẽ lại. Sử dụng dịch vụ '$ timeout' là một giải pháp đã biết để thêm thay đổi trong hàng đợi, vì vậy nó xảy ra ngay sau khi vẽ lại HTML. – ViniciusPires

+1

nó hoạt động như một sự quyến rũ –

Các vấn đề liên quan