- เมื่อ Modal เปิดขึ้นให้ตั้งโฟกัสไปที่ <input> ที่กำหนดไว้ล่วงหน้าภายใน Modal นี้
กำหนดคำสั่งและให้มัน $ เฝ้าดูสถานที่ให้บริการ / ทริกเกอร์เพื่อให้มันรู้ว่าเมื่อใดที่จะมุ่งเน้นองค์ประกอบ:
Name: <input type="text" focus-me="shouldBeOpen">
app.directive('focusMe', ['$timeout', '$parse', function ($timeout, $parse) {
return {
//scope: true, // optionally create a child scope
link: function (scope, element, attrs) {
var model = $parse(attrs.focusMe);
scope.$watch(model, function (value) {
console.log('value=', value);
if (value === true) {
$timeout(function () {
element[0].focus();
});
}
});
// to address @blesh's comment, set attribute value to 'false'
// on blur event:
element.bind('blur', function () {
console.log('blur');
scope.$apply(model.assign(scope, false));
});
}
};
}]);
Plunker
ดูเหมือนว่าการหมดเวลาของ $ จะต้องใช้เวลาในการแสดงผล
'2' ทุกครั้งที่ <input> ปรากฏให้เห็น (เช่นโดยคลิกที่ปุ่ม) ตั้งโฟกัสไว้
สร้างคำสั่งเป็นหลักเช่นเดียวกับข้างต้น ดูคุณสมบัติขอบเขตบางส่วนและเมื่อมันกลายเป็นจริง (ตั้งค่าในการจัดการงะคลิกของคุณ) element[0].focus()
ดำเนินการ ขึ้นอยู่กับกรณีการใช้งานของคุณคุณอาจหรืออาจไม่ต้องการ $ timeout สำหรับสิ่งนี้:
<button class="btn" ng-click="showForm=true; focusInput=true">show form and
focus input</button>
<div ng-show="showForm">
<input type="text" ng-model="myInput" focus-me="focusInput"> {{ myInput }}
<button class="btn" ng-click="showForm=false">hide form</button>
</div>
app.directive('focusMe', function($timeout) {
return {
link: function(scope, element, attrs) {
scope.$watch(attrs.focusMe, function(value) {
if(value === true) {
console.log('value=',value);
//$timeout(function() {
element[0].focus();
scope[attrs.focusMe] = false;
//});
}
});
}
};
});
Plunker
Update 7/2013 : ฉันเห็นบางคนใช้คำสั่งขอบเขต isolate ดั้งเดิมของฉันแล้วมีปัญหากับฟิลด์อินพุตแบบฝัง (เช่นฟิลด์อินพุตในโมดอล) คำสั่งที่ไม่มีขอบเขตใหม่ (หรืออาจเป็นขอบเขตเด็กใหม่) ควรบรรเทาความเจ็บปวดบางส่วน ดังนั้นด้านบนฉันปรับปรุงคำตอบที่จะไม่ใช้ขอบเขตแยก ด้านล่างนี้เป็นคำตอบเดิม:
คำตอบดั้งเดิมสำหรับ 1. โดยใช้ขอบเขต isolate:
Name: <input type="text" focus-me="{{shouldBeOpen}}">
app.directive('focusMe', function($timeout) {
return {
scope: { trigger: '@focusMe' },
link: function(scope, element) {
scope.$watch('trigger', function(value) {
if(value === "true") {
$timeout(function() {
element[0].focus();
});
}
});
}
};
});
Plunker
คำตอบดั้งเดิมสำหรับ 2 โดยใช้ขอบเขต isolate:
<button class="btn" ng-click="showForm=true; focusInput=true">show form and
focus input</button>
<div ng-show="showForm">
<input type="text" focus-me="focusInput">
<button class="btn" ng-click="showForm=false">hide form</button>
</div>
app.directive('focusMe', function($timeout) {
return {
scope: { trigger: '=focusMe' },
link: function(scope, element) {
scope.$watch('trigger', function(value) {
if(value === true) {
//console.log('trigger',value);
//$timeout(function() {
element[0].focus();
scope.trigger = false;
//});
}
});
}
};
});
Plunker
เนื่องจากเราจำเป็นต้องรีเซ็ตคุณสมบัติทริกเกอร์ / focusInput ในคำสั่ง '=' จะใช้สำหรับการบันทึกข้อมูลแบบสองทาง ในคำสั่งแรก '@' ก็เพียงพอแล้ว โปรดทราบว่าเมื่อใช้ '@' เราจะเปรียบเทียบค่าทริกเกอร์กับ "true" เนื่องจาก @ จะให้ผลลัพธ์เป็นสตริงเสมอ