我是Angular的新手,並試圖理解高級指令API - 我想使用指令元素屬性在編譯函數中重新創建指令模板。 但是,當我沒有模板集(或模板是空字符串),而是訪問孤立的指令範圍,我訪問父(控制器)範圍。此外 - 這工作對角1.1而不是1.2指令與模板之間的區別與沒有模板和Angular 1.2和1.1之間的區別?
這裏是HTML:
<div class="container" ng-app="app" ng-controller="AppController">
<sandbox title="Attribute Title"></sandbox>
</div>
的JavaScript:
var app = angular.module('app', [], function() {});
app.controller('AppController', function ($scope) {
$scope.title = "AppController title";
});
app.directive('sandbox', function ($log, $compile) {
return {
restrict: 'E',
scope: {
title: "@"
},
controller: function ($scope, $element, $attrs) {
$scope.title = "Directive Controller title";
},
template: '<h1>Template</h1>', // change it to: '' and Run, than change Angular to 1.2.x
compile: function (tElement, tAttrs) {
tElement.append('<h2> Title = {{ title }}</h2>');
}
}
});
當你運行它,你得到:
模板
Title = Att ribute標題
但是,當您更改模板,您角1.2得到空字符串:
標題= AppController的標題
而且隨着角度1.1.1:
標題=屬性標題
我的問題:
爲什麼在設置模板和未設置模板時訪問範圍存在差異? (bug? - 沒有'template'的指令和isoleted範圍是否包含控制器範圍而不是指令範圍)?爲什麼在Angular 1.1和1.2之間存在差異?
如何在編譯函數中構建訪問獨立範圍的模板而不是在Angular 1.2中的父範圍?
爲什麼指令控制器函數不會使用$ scope.title =「...」更改'title',但是當調試'link'函數'title'中的'scope'參數值是'Directive Controler Title'但它內部(在哪裏尋找它)綁定isoleted作用域'屬性值'?
這裏的jsfiddle播放使用:http://jsfiddle.net/yoorek/zQ66L/4/
很好的答案,但#4一段時間以來都不是真的。我認爲從1.1.x開始,「@」將在鏈接函數的作用域中定義。看到這個例子:http://plnkr.co/edit/IVfc7P1a9Kj4RQTrp7Dx?p=preview – dtabuenc
@dtabuenc看看這個更新的plnkr:http://plnkr.co/edit/fH452EsTPjEJNJV0L6Xa所以我認爲使用示波器版本仍然有風險(取決於繼承) - 但我很樂意錯誤。 – KayakDave
鏈接函數中$ scope的使用沒有問題,它在控制器中的用法不正確。 「@」綁定是單向的,因此永遠不會寫入。寫入它的任何值都將在下一個摘要循環中被覆蓋。 – dtabuenc