ฉันจำเป็นต้องใช้ฟังก์ชันลิงก์ในคำสั่งหลังจากการตอบกลับ http แนวคิดเป็นดังนี้:
<input type="text" my-field>
<script>
angular.module("mine")
.controller ('myCtrl', function ($scope) {
$http.get("/my/service").success(function (data, status, headers, config) {
// OK, done with the query... now I know my field name to bind to. Somehow
// I have to get it down to the link function below...
});
})
.directive ('myField', function ($compile) {
return {
link: function (scope, element, attrs) {
var my_field = attrs.myField;
element.removeAttr('my-field');
// Somehow figure out the field here in ngFieldSpec
element.attr('ng-model', ngFieldSpec);
$compile(element)(scope);
};
});
</script>
ที่นี่ ฉันต้องผูกฟิลด์อินพุตเข้ากับองค์ประกอบของการตอบกลับ แต่ฉันไม่รู้ว่าองค์ประกอบนั้นจะถูกเรียกว่าอะไรจนกว่าฉันจะได้รับคำตอบ แต่เมื่อฉันรันมัน ลิงก์ของคำสั่งจะทำงานก่อนที่ $http จะเสร็จสิ้น: ลำดับที่แท้จริงคือ
- $http.get เริ่มต้น
- เรียกใช้ฟังก์ชันลิงก์ของคำสั่ง
- $http.get คืนความสำเร็จ
ฉันค่อนข้างคุ้นเคยกับ $q แต่ไม่แน่ใจว่าจะนำไปใช้ทำสิ่งที่ต้องทำได้อย่างไร อย่างไรก็ตาม ฉันได้แสดงช่องป้อนข้อมูลเพียงช่องเดียวที่เรียกใช้คำสั่ง myField แต่อาจมีหลายช่องในหน้านี้ และช่องเหล่านั้นทั้งหมดต้องการข้อมูลเดียวกัน
แก้ไขเพื่อเพิ่มข้อมูลเพิ่มเติมเพื่อตอบสนองต่อคำขอ:
ฉันมีบริการที่ส่งคืนโครงสร้างข้อมูล JSON ฉันไม่ทราบล่วงหน้าแน่ชัดว่าโครงสร้างข้อมูลนั้นจะมีลักษณะอย่างไร แต่ฉันสามารถเข้าใจและจับคู่ฟิลด์กับฟิลด์อินพุตของเพจของฉันได้ ฉันกำลังพยายามจับคู่สิ่งนี้ในฟังก์ชันลิงก์ ฉันดีใจที่ได้ทำที่อื่น ฉันสามารถทำได้ในฟังก์ชัน $http.success แต่นั่นจะเป็นการดำเนินการจัดการ DOM ในคอนโทรลเลอร์ และความเข้าใจของฉันก็คือการจัดการ DOM ควรทำในคำสั่งเท่านั้น
HTML ของฉันต้องมีลักษณะดังนี้:
<input type="text" my-field="[MY_EXTENSION_NAME]myFieldName">
<input type="text" my-field="[MY_EXTENSION_NAME]myFieldName2">
<input type="text" my-field="[MY_EXTENSION_NAME_2]myFieldName">
การตอบกลับจากเซิร์ฟเวอร์จะเป็นดังนี้:
{
realField1: "Diddly",
realField2: "Squat",
extensions: [
{
name: "MY_EXTENSION_NAME",
fields: [
{ name="myFieldName" value="Foo" },
{ name="myFieldName2" value="Bar" }
]
},
{
name: "MY_EXTENSION_NAME_2",
fields: [
{ name="myFieldName" value="Baz" },
{ name="myFieldName2" value="Buz" }
]
}
]
}
การตอบสนองของเซิร์ฟเวอร์อาจแตกต่างกันเนื่องจาก:
- อาจมีส่วนขยายจำนวนเท่าใดก็ได้ ("MY_EXTENSION_NAME" ฯลฯ)
- ส่วนขยายอาจส่งคืนในลำดับใดก็ได้
- อาจมีฟิลด์จำนวนเท่าใดก็ได้
- ฟิลด์อาจถูกส่งคืนในลำดับใดก็ได้
ปัญหาทั้งหมดที่นี่คือฉันต้องการแปลง "[MY_EXTENSION_NAME]myFieldName" เป็น ng-model "model.extensions[0].fields[0].value อย่างไรก็ตาม ตอนนี้ฉันกำลังคิดที่จะแปลงข้อมูลเป็นรูปแบบมาตรฐานในระหว่างการอ่าน จะง่ายกว่า ดังนั้น ng-model จึงสามารถเป็น "model.my_extension_name.myFieldName" ได้
$watch
สามารถช่วยได้ - person Beterraba   schedule 11.01.2014$compile
ภายในฟังก์ชันลิงก์ คุณอาจสามารถบรรลุสิ่งที่คุณต้องการได้ด้วยขอบเขตที่แยกได้โดยใช้ '@' โปรดอธิบายสิ่งที่คุณต้องการทำ - person Ilan Frumer   schedule 11.01.2014