Я хочу обновить область внутри директивы, которая находится за пределами моего основного вида, здесь мой код:
index.html
<!-- the directive I want to update -->
<nav sitepicker></nav>
<section id="content-wrapper">
<!-- main content-->
<div ui-view></div>
</section>
sitepicker
очень важен только выпадающее меню, которое содержит некоторую структуру html.
sitepicker.html
<span>{{currentWebsite}}</span> <-- this is the one I want to update
<ul>
<li ng-repeat="website in websites">{{website.name}}</li>
</ul>
и JS:
.controller('sitepicker', function($scope, websiteService)
$scope.website = websiteService.currentWebsite; // not updating eventhough I update this in overview.js
});
overview.js
.controller('OverviewCtrl', function($scope, websiteService) {
websiteService.currentWebsite = website; // assume that this value is dynamic
});
но currentWebsite
не меняется. Как я могу обойти это? Я хочу избежать использования $rootScope
потому что я знаю, что это плохо.
Здесь мое обслуживание:
.factory('websiteService', function() {
var currentWebsite;
return {
currentWebsite: currentWebsite
};
});
Редактировать: добавление таких часов работает, но я не уверен, что его хороший
.controller('sitepicker', function($scope, websiteService)
$scope.$watch(function() {
$scope.website = websiteService.currentWebsite;
});
});
Решение №1
Мы можем добавить $watch
чтобы сделать это возможным
.controller('sitepicker', function($scope, websiteService)
$scope.$watch(function(){
return websiteService.currentWebsite;
}, function(newValue){
// Do something with the new value
});
});
Решение №2
Мы также можем определить websites
в нашем основном контроллере. Затем мы можем обновить его в нашем overview
дочернем контроллере так:
.controller('sitepicker', function($scope, websiteService)
$scope.$parent.website = websiteService.currentWebsite;
});
важно использовать $parent
Поскольку мы обновляем контроллер, который завершает работу всего приложения, мы сможем получить к нему доступ из любой точки, любой директивы, контроллера, представления и т.д.
websiteService
. ЕслиcurrentWebsite
является примитивом, то нет наследования примитивов, и использование объекта решит проблему