指令的 2 向绑定不起作用
2-way binding for directive not working
我有一个自定义的 Angular 指令,它有一个独立的作用域,其值基映射为双向绑定
基===
我从父作用域将 base 传递给指令
并且在指令控制器中我正在修改这个基值。 base 不仅仅是一个对象,而是一个 json 结构,其内部有数组。我横向到 base 内的几个字段,然后更改这些字段值。例如,一个字段从 0 更改为 1。
现在,在父控制器中的另一个方法中,我从原始 JSON 中选择了这个基数,从那里它被传递到指令。我希望指令中更改的值反映在原始 JSON 对象中。
不幸的是,这没有发生。我想 2-way 绑定前缀应该可以实现。
不好意思,由于指令模板太大,暂时没有上传。以后有可能我会尝试上传微缩版的
与此同时,我是否哪里出错了,有没有具体需要做的事情。?
一个有效的 fiddle 说明这可能会有所帮助。我用谷歌搜索并找到了名为 $broadcast 和 $emit 的东西。我不确定在这种情况下如何使用它们,而且我以前从未使用过它们。
期待小伙伴们的帮助..
编辑:
return {
scope: {
parent: '='
item: '=',
},
controller: 'ctrlname',
templateUrl:'tplname',
link: function (scope, element, attr) {
}
在 html 中类似于:
<li ng-repeat= l in originalJSON>
-----------something here------
<li ng-repeat= base in l>
---------something here-------
<li ng-repeat="x in base.y">
<div layout="row" layout-wrap directive-name parent="base" item="item" ></div>
</li>
</li>
</li>
抱歉是“=”
再补充一个重要的信息。在父控制器中,我试图访问 originalJSON 并在其中的基本字段中查找修改的字段。
您不能使用 services/factories 共享基础对象吗?父作用域也是一个指令吗?
@ 不是双向绑定,对于双向绑定,您需要使用 =
scope: {
"twoway": "=" // two way binding
},
您遇到的问题是多个指令将两种方式绑定到同一个对象。
这一行出现了几次(等于base中的项目数):
<div layout="row" layout-wrap directive-name parent="base" item="item" ></div>
所以你在父类和基类之间有几个双向绑定。这些都位于一个 for 循环中,它将监视 base 是否有任何更改并在必要时更新循环。我想这很容易导致您的代码出现问题。
也许,您可以改为绑定到 x?
编辑澄清(根据评论要求):
您有正在更新的 'base' 对象,这是在多个指令上使用两种方式绑定。因此,你有:
基础对象 'a' 与指令 1 中的对象 'b' 保持同步。
基础对象 'a' 与指令 2 中的对象 'c' 保持同步。
基础对象 'a' 与指令 3 中的对象 'd' 保持同步。
等等在你的for循环中。然后,当你的指令被处理时,你有一些逻辑来更新 b、c 和 d——这反过来你希望更新 a。这些事件可能会同时触发。每次它们触发时,您的 for 循环(循环遍历 a 中的元素)会识别出 'a' 已更改并显示 'lets calculate the results of this for loop again'。然后将再次创建每个指令 - 可能会触发更多逻辑来更改 a.
您的问题中没有足够的信息来说明这是问题所在,但希望您可以从我的描述中看出竞争条件可能是这里的问题。相反,在你的 for 循环中绑定到 x(如果需要的话,可以通过一种方式绑定到基础对象)应该是一种更安全的实现你想要的方法。
我有一个自定义的 Angular 指令,它有一个独立的作用域,其值基映射为双向绑定 基===
我从父作用域将 base 传递给指令
并且在指令控制器中我正在修改这个基值。 base 不仅仅是一个对象,而是一个 json 结构,其内部有数组。我横向到 base 内的几个字段,然后更改这些字段值。例如,一个字段从 0 更改为 1。
现在,在父控制器中的另一个方法中,我从原始 JSON 中选择了这个基数,从那里它被传递到指令。我希望指令中更改的值反映在原始 JSON 对象中。
不幸的是,这没有发生。我想 2-way 绑定前缀应该可以实现。 不好意思,由于指令模板太大,暂时没有上传。以后有可能我会尝试上传微缩版的
与此同时,我是否哪里出错了,有没有具体需要做的事情。?
一个有效的 fiddle 说明这可能会有所帮助。我用谷歌搜索并找到了名为 $broadcast 和 $emit 的东西。我不确定在这种情况下如何使用它们,而且我以前从未使用过它们。
期待小伙伴们的帮助..
编辑:
return {
scope: {
parent: '='
item: '=',
},
controller: 'ctrlname',
templateUrl:'tplname',
link: function (scope, element, attr) {
}
在 html 中类似于:
<li ng-repeat= l in originalJSON>
-----------something here------
<li ng-repeat= base in l>
---------something here-------
<li ng-repeat="x in base.y">
<div layout="row" layout-wrap directive-name parent="base" item="item" ></div>
</li>
</li>
</li>
抱歉是“=”
再补充一个重要的信息。在父控制器中,我试图访问 originalJSON 并在其中的基本字段中查找修改的字段。
您不能使用 services/factories 共享基础对象吗?父作用域也是一个指令吗?
@ 不是双向绑定,对于双向绑定,您需要使用 =
scope: {
"twoway": "=" // two way binding
},
您遇到的问题是多个指令将两种方式绑定到同一个对象。
这一行出现了几次(等于base中的项目数):
<div layout="row" layout-wrap directive-name parent="base" item="item" ></div>
所以你在父类和基类之间有几个双向绑定。这些都位于一个 for 循环中,它将监视 base 是否有任何更改并在必要时更新循环。我想这很容易导致您的代码出现问题。
也许,您可以改为绑定到 x?
编辑澄清(根据评论要求): 您有正在更新的 'base' 对象,这是在多个指令上使用两种方式绑定。因此,你有: 基础对象 'a' 与指令 1 中的对象 'b' 保持同步。 基础对象 'a' 与指令 2 中的对象 'c' 保持同步。 基础对象 'a' 与指令 3 中的对象 'd' 保持同步。
等等在你的for循环中。然后,当你的指令被处理时,你有一些逻辑来更新 b、c 和 d——这反过来你希望更新 a。这些事件可能会同时触发。每次它们触发时,您的 for 循环(循环遍历 a 中的元素)会识别出 'a' 已更改并显示 'lets calculate the results of this for loop again'。然后将再次创建每个指令 - 可能会触发更多逻辑来更改 a. 您的问题中没有足够的信息来说明这是问题所在,但希望您可以从我的描述中看出竞争条件可能是这里的问题。相反,在你的 for 循环中绑定到 x(如果需要的话,可以通过一种方式绑定到基础对象)应该是一种更安全的实现你想要的方法。