AngularJS - обновить директиву вне представления

0

Я хочу обновить область внутри директивы, которая находится за пределами моего основного вида, здесь мой код:

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;
    });
});
  • 0
    Пропущена важная часть ... показать websiteService . Если currentWebsite является примитивом, то нет наследования примитивов, и использование объекта решит проблему
  • 0
    извините, я обновил его. хотя это действительно просто. проверьте решение, которое я придумала .. мне это не нравится
Показать ещё 3 комментария
Теги:
view
service

1 ответ

0

Решение №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

Поскольку мы обновляем контроллер, который завершает работу всего приложения, мы сможем получить к нему доступ из любой точки, любой директивы, контроллера, представления и т.д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню