所以我一直在關注如何使用Angular製作交互式SVG地圖。我現在正處在我想要自己發泄的地步,並讓它做我想做的事情。角度綁定:控制器不會更新指令
具體來說,我想點擊地圖上的區域,彈出信息有關的側邊欄區域。首先,顯示點擊區域的名稱。
然而,即使是在網上查看10個以上的教程,我似乎無法弄清楚什麼是不工作。 我試圖更新的變量是$ scope.selected在控制器,從我可以看到我已經在指令範圍內正確地進行了綁定,不知道我哪裏出錯了。一直嘗試不同的東西幾個小時,但getitng無處,任何幫助將不勝感激。謝謝!
angular.module('SvgMapApp', ['ngRoute'])
.controller('MainCtrl', ['$scope', function ($scope) {
$scope.wardList = ["St. Anthony's Ground Floor", "Endoscopy", "St. Laurence's Corridor", "Sacred Heart Ward", "Physiotherapy"];
$scope.selected = {name: "none"};
}]);
angular.module('SvgMapApp').directive('svgMap', ['$compile', function ($compile) {
return {
restrict: 'A',
templateUrl: 'img/GFloorMk1.svg',
link: function (scope, element, attrs) {
var areas = element[0].querySelectorAll('.ward');
angular.forEach(areas, function (path, key) {
var areaElement = angular.element(path);
areaElement.attr("area", "");
$compile(areaElement)(scope);
})
}
}
}]);
angular.module('SvgMapApp').directive('area', ['$compile', function ($compile) {
return {
restrict: 'A',
scope: {
selected: '=',
},
link: function (scope, element, attrs) {
scope.elementId = element.attr("id");
scope.areaClick = function() {
scope.selected = scope.elementId;
alert(scope.elementId);
};
element.attr("ng-click", "areaClick()");
element.removeAttr("area");
$compile(element)(scope);
}
}
}]);
這是主索引頁。該視圖顯示正在顯示的地圖當前樓層的SVG。
<html>
<head lang="en">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Data Responsive SVG Map</title>
<link rel="stylesheet" href="css/bootstrap.min.css"/>
<link rel="stylesheet" href="css/main.css"/>
</head>
<body ng-app="SvgMapApp" ng-controller="MainCtrl">
<div class="container">
<div class="row">
<div class="col-md-4"><a href="#/gfloor">Ground Floor</a></div>
<div class="col-md-4"><a href="#/1stfloor">First Floor</a></div>
<div class="col-md-4"><a href="#/2ndfloor">Second Floor</a></div>
</div>
<div class="row">
<div class="col-md-10">
<div ng-view></div>
</div>
<div class="col-md-2">
<div class="row">
<h2>Ward Name</h2>
<h2> {{ selected.name }}</h2>
</div>
</div>
</div>
<script src="js/angular.js"></script>
<script src="js/angular-route.js"></script>
<script src="js/controllers.js"></script>
<script src="js/directives.js"></script>
<script src="js/filters.js"></script>
</body>
</html>
而在gfloor.html部分,這是指令如何顯示在視圖中。
<div svg-map
class = "directive",
selected = "selected">
我看到你把選擇爲「區域」上的雙向綁定變量,但我沒有看到你在外部任何地方分配這個「選定」變量。那麼,「選擇」綁定到哪裏?無處......這就是爲什麼你的外部示波器永遠不會被告知「區域」指令內部的任何變化 –
感謝您的答覆!我在考慮用於雙向綁定的語法意味着控制器中的$ scope.selected會被指令中具有相同名稱的變量更新 - 這不是這種情況嗎?如何正確綁定選定的變量?乾杯。編輯:等等,是因爲'area'是'svgMapApp'的一個小孩嗎?是否也必須在svgMapApp中有一個綁定,從技術上講,這是控制器父級範圍內的指令? – Shane
任何人都可以澄清什麼帕特里克'選定'變量意味着沒有被綁定在外面?我想知道是否應該更改SvgMapApp指令而不是區域指令,以便將它傳遞給控制器,但是我有點丟失... – Shane