2015-10-26 77 views
0

我有一個標記:我爲什麼必須經過兩次 - 隔離範圍的方法參數?

<div ng-controller="ProductController"> 
     <inventory-Product 
       on-report="showData(p.name,p.price)" 
       ng-repeat="p in products" 
       name="{{p.name}}" 
       price="{{p.price}}"> 
     </inventory-Product> 
</div> 

而且一個指令:

myApp.directive("inventoryProduct", function() 
{ 
    return { 
     restrict: "E", 
     scope : { 
      name : "@", 
      price: "@", 
      onReport:"&" 
     }, 
     template: '<div>{{name}} costs {{ price}}$ </div> \ 
        <div>\ 
        <button \ 
         class="btn btn-lg btn-danger" \ 
         ng-click="onReport({name:name,price:price})">\ 
        Change name\ 
        </button>\ 
        </div>' 

    } 
}) 

(代碼是工作)

問:

onReport:"&"允許指令調用一些parentScope函數並傳入其參數。

好了 - 所以onReport就像委託指向任何功能,在HTML標記被宣佈:

on-report="showData(p.name,p.price)" 

但如果該指令的模板已經發送論點:

ng-click="onReport({name:name,price:price})" 

而且parentScope的控制器功能已經知道功能:

$scope.showData = function (name,price) 
    { 
     alert("name="+name+" price="+price) 
    } 

然後爲什麼我必須提及

on-report="showData(p.name,p.price)" ? 

換句話說再次參數,似乎更符合邏輯寫

on-report="showData" 

所以它只是的功能,然後用這個路徑去:

enter image description here

我缺少什麼?

回答

1

嘗試用ng-click="onReport()",它會正常工作。或者試試on-report="showData(name, price)",它也應該可以正常工作。

當您要從指令本身傳遞參數(將分別稱爲name和price)時,您可以從指令中使用onReport({name:name,price:price})。如果指令計算值,存儲在其自己的分離範圍,必須傳遞給函數它是有用的:呼叫控制器無法訪問這些值,因爲它們在其範圍內不是。

如果控制器已經有值傳遞給它的作用域中的函數,並且該指令應該執行該函數調用(如您的示例中所示),那麼onReport()就是您所需要的。

+0

謝謝。當你說_調用控制器不能訪問這些值,因爲它們不在其範圍內 - - 什麼調用控制器?換句話說,我的樣本中實際發生了什麼? (參數POV),如果控制器沒有這些值會怎麼樣? –

+0

調用控制器是ProductController。它在由該控制器控制的視圖內部,該指令被使用。所以showData()是一個暴露在該控制器範圍內的函數。 –

+0

*如果控制器沒有這些值,那該怎麼辦?然後你會使用'on-report =「showData(name,price)」',這兩個參數將由指令提供,使用'onReport({name:name ,價格:價格})'。 –

相關問題