2017-03-09 64 views
0

我需要从父指令(绑定到控制器X)传递一个值到一个子指令,更新它,然后将它传递回去控制器X updateItem功能。

这会导致父控制器X接收更新的值,这会触发新的$digest循环,并将项目向下传递到链中,依此类推。这会导致无限循环(discussed here)。

我需要更新子指令的值,所以一旦控制器的$scope.items更新,我该如何避免重新触发$digest周期?

父控制器X:

$scope.updateItem = function(item) { 
    $scope.items = item; 
}; 

家长指令模板:绑定到父控制器

<div> 
    <custom-phrases item-to-update="item" update-item="updateItem"></custom-phrases> 
</div> 

家长指令JS:

angular 
    .module('app') 
    .directive('itemlist', 
    function($rootScope, $state) { 
     return { 
     restrict: 'EA', 
     templateUrl: 'directives/cms/itemlist/itemlist.tpl.html', 
     scope: { 
     }, 
     link: function(scope, element) { 
      // 
     }, 
     controller: parentControllerX 
     }; 
    }); 

儿童指令JS:

angular 
    .module('app') 
    .directive('customPhrases', 
    function($rootScope) { 
     return { 
     restrict: 'AE', 
     scope: { 
      itemToUpdate: '=', 
      updateItem: '=', 
     }, 
     templateUrl: 'directives/cms/customPhrases/custom_phrases_directive.tpl.html', 
     link: function(scope, element) { 

      scope.itemToUpdate.attr1 += 1; 
      scope.itemToUpdate.attr2 += 1; 

      // then pass it back to parent directive 
      scope.updateItem(scope.itemToUpdate); 
      ... 

如果我更改为{{ item }}

<div> 
    <custom-phrases item-to-update="{{ item }}" update-item="updateItem"></custom-phrases> 
</div> 

它传递到孩子的指令,它涉及通过一个字符串,而不是一个对象。


编辑2:

如果我只是在孩子指令更新items,就像这样:

scope.items = { 
    test: 'testing 123' 
    }; 

并保持2路在孩子指令绑定:

items: '=', 

scope.items从不会在父指令和控制器级别更新。

+0

什么是应该启动更新? – Yatrix

+0

该项目在控制器和指令的实例化中通过链传递给子指令。子指令更新值并返回到父指令和控制器 – Growler

+0

因此它只更新一次? – Yatrix

回答

0

如果您的孩子的指示注意更新值并将其传回给父母,那么您不需要与=进行双向绑定。

你可以用一种方式与<

scope: { 
     itemToUpdate: '<', // use one way binding 
     updateItem: '=', 
    } 

编辑绑定:

我的坏: 你已经有双向数据绑定,你不需要通过它从子指令回来。

scope.updateItem(scope.itemToUpdate);。 //不需要

它将在那里自动提供。

+0

请参阅上面的更新。我现在如何解析子控制器中的对象?它通过字符串来形成 – Growler

+0

我可以使用JSON解析我猜想 – Growler

+0

@Growler然后'scope.itemToUpdate'将是字符串,而不是变量。您可以用'@'.i来实现同样的事情。我不知道你用这个做了什么操作传递的数据。所以,不清除你为什么传递它作为插值 –

0

我相信你的问题是你在链接函数中调用更新。因此,您正在更新该项目,导致视图更新,这会导致摘要循环,然后永远循环。

您的方法没有任何意义。如果你的父控制器有更新你的项目的功能,为什么你打扰绑定函数呢?只要绑定item并让父控制器处理更新而不尝试来回传递它。无论绑定属性是来自父级,只需将其作为参数直接添加到item即可。

通过尝试从子级调用父控制器的更新方法,而不是让双向绑定在item上执行它的魔法,您已经过分复杂化了什么是简单绑定解决方案。

+0

请参阅我的上述评论。我通过更新我的子指令中的'$ scope.items'来简单地开始,但它从来没有更新过。 – Growler