我知道这可能已经多次回答了,甚至可能会在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指令的视图,当我再次进入视图时,列表项不会被重新加载(这可能是因为链接(...)函数只运行一次,然后缓存该指令。
我可以确保视图和指令没有被缓存,然后它可以工作。但它必须是一个更好的方法来做到这一点?或者我运气不好?
答案 0 :(得分:0)
不使用apply
,watch
,...的解决方案在此帖子中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
注入控制器)
也有效