如何在指令控制器和父作用域之间同步数据

时间:2017-01-02 15:56:40

标签: javascript angularjs angularjs-directive

我知道这可能已经多次回答了,甚至可能会在Angular文档中指出,但我不能理解如何做到这一点'纠正'。

我有一个指令,用于列出具有用户定义对象的表中的项目。我希望项目在指令和它所在的范围之间同步(例如,如果在父作用域中添加或删除了项目,我希望相应地更新列表。反之亦然;如果项目是在列表中选择,我希望父母知道这一点。)最后,我希望它是共享内存,这样数据才能正常工作,而不需要$ watch,$ apply& $ dispatch,如果可能的话。

我以为我可以这样做:

指令:

{
  restrict: 'E',
  templateUrl: 'js/components/selectionList/component.selectionList.html',
  controller: 'SelectionlistCtrl',
  controllerAs: 'selecListCtrl',
  scope: {
    items: '='
  },
  link:  (scope, element, attrs) => {
    scope.selecListCtrl.items = scope.items;
  }
}

HTML:

<selection-list items="vm.items" />

vm是父作用域中的控制器,而items是一个对象数组。这种方式有效,但是一旦我离开包含selection-list指令的视图,当我再次进入视图时,列表项不会被重新加载(这可能是因为链接(...)函数只运行一次,然后缓存该指令。

我可以确保视图和指令没有被缓存,然后它可以工作。但它必须是一个更好的方法来做到这一点?或者我运气不好?

1 个答案:

答案 0 :(得分:0)

不使用applywatch,...的解决方案在此帖子中AngularJS: Parent scope is not updated in directive (with isolated scope) two way binding这是在接受答案的答案之下,我在这里复制了

angular.module('app')
.directive('navbar', function () {
    return {
        templateUrl: '../../views/navbar.html',
        replace: 'true',
        restrict: 'E',
        scope: {
            email: '='
        },
        link: function (scope, elem, attrs) {
            scope.$on('userLoggedIn', function (event, args) {
                scope.email = args.email;
            });
            scope.$on('userLoggedOut', function (event) {
                scope.email = false;
                console.log(newValue);

            });

        }
    }
});

$rootScope.$broadcast('userLoggedIn', user);发出控制器中的事件

.$emit.$on的更多信息位于Working with $scope.$emit and $scope.$on

这也很有趣:https://blog.umur.io/2013/07/02/angularjs-directives-using-isolated-scope-with-attributes/

也许

$route.reload()

(将$route注入控制器)

也有效

请参阅How can I tell AngularJS to "refresh"