我創建了一個指令來理解轉換和隔離範圍。 下面是HTML:AngularJs指令轉換錯誤和@綁定
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<div>
<input type="text" ng-model="name" />
<input type="number" ng-model="friendCount" />
</div>
<my-friends name="{{name}}">
<p>Hi, I'm {{name}}, and I have {{friendCount}} friends</p>
</my-friends>
</div>
</div>
指令:
var app = angular.module('myApp', []);
app.controller('MyCtrl', function ($scope) {
$scope.name = "John Doe";
$scope.friendCount = 3;
});
app.directive('myFriends', function() {
return {
restrict: 'E',
replace: true,
template: '<div>' +
' <h3> Isolated Scope: {{name}}</h3>' +
' <div ng-transclude></div>' +
'</div>',
transclude: true,
scope: {
name: '@'
},
link: function (scope, element, attrs) {
scope.name = "Anderson";
}
}
});
打開此琴:JsFiddle
我有兩個問題:
爲什麼{{名} }在指令模板中說「John Doe」而不是「Anderson」?我期望它是Anderson,因爲name屬性是原型繼承的,並且一旦在鏈接函數中寫入它,就會失去祖先連接。
它似乎是transcluding正確,但它爲什麼會拋出錯誤錯誤:[ngTransclude:orphan]在開發工具控制檯?它可能是我使用的角度版本?
任何幫助,非常感謝。
這裏是小提琴:JsFiddle
UPDATE:
的transclusion誤差是由於誤加載角的兩倍。
使用@
綁定時,您可以在初始摘要循環完成後覆蓋name
裏面的指令,例如在點擊處理程序中。但是,只要更改父範圍的名稱屬性,它就會被覆蓋。
關於@
綁定的問題是我對孤立範圍的誤解。它正在按照它在示例中應有的方式工作。 隔離範圍不會從父項原型繼承。而且綁定的含義也被稱爲只讀訪問或單向綁定,它不會讓你更新/寫入父範圍。
修訂FIDDLE
謝謝Khanh。很好的接收。我刪除了角度的第二個引用後,transclusion錯誤消失了。但是,使用@綁定,即使最初將name屬性綁定到控制器,我也應該可以在指令鏈接函數中覆蓋它,而無需修改父級/控制器範圍,對吧? – Harish
@Harish:實際上,你可以覆蓋鏈接函數中的值。但是,循環結束時,角度更新綁定時,angular會評估你的表達式('{{name}}')並重寫你的作用域的屬性。要解決這個問題,請嘗試'='綁定 –