gpt4 book ai didi

javascript - 为什么这些 AngularJS 组件之一成功显示了 ng-model 的值,而另一个却没有?

转载 作者:行者123 更新时间:2023-12-02 14:21:47 29 4
gpt4 key购买 nike

我正在尝试创建一系列可以导入到一个主要组件中的动态组件。当我可以将所有对象传递到一个绑定(bind)中时,与为每个传递的对象创建多个绑定(bind)相比,在组件内嵌套组件要容易得多。所以我创建了一个 plunkr 来演示我想要实现的目标。理想情况下,我希望能够将对象从父组件传递到子组件的 ng-model 中,而无需创建单独的绑定(bind)。

这可能吗?有人可以向我提供任何建议或解释来解释为什么嵌套组件仅在本地更新模型而不是在整个 View 中吗?

基本上,如果您查看下面的 plunkr,我希望 cNestedComponent 的工作方式与 cDirectComponent 的工作方式相同,其中数据绑定(bind)从组件模板内部和模板外部更新。

http://plnkr.co/edit/vusx9rm1DnkbBlNBGyZG?p=preview

标记:

<h1> Data Comment => {{ data.comment }} </h1>
<c-direct-input plplaceholder="direct component" plmodel="data.comment" pltype="text"></c-direct-input>
<c-nested-input input-bindings="{type: 'text', model: 'data.comment', placeholder: 'nested component'}"></c-nested-input>

组件:

app.component('cNestedInput', {
template: '\
<h2> Nested Component </h2>\
<p style="display: block;"> {{ $ctrl.inputBindings.model }} </p>\
<input type="{{ $ctrl.inputBindings.type }}" placeholder="{{$ctrl.inputBindings.placeholder}}" ng-model="$ctrl.inputBindings.model" />\
',
bindings: {
inputBindings: '='
},
controller: function($scope) {}
});

app.component('cDirectInput', {
template: '\
<h2> Direct Component </h2>\
<p style="display: block;"> {{ $ctrl.plmodel }} </p>\
<input type="{{ $ctrl.pltype }}" placeholder="{{ $ctrl.plplaceholder }}" ng-model="$ctrl.plmodel" />\
',
bindings: {
plplaceholder: '@',
plmodel: '=',
pltype: '@'
},
controller: function($scope) {}
});

================================================== =========

更新

根据用户 Julien Tassin 的反馈,我创建了一个更新的 plunker,它更干净,而且我认为更好地展示了我的目标:

https://plnkr.co/edit/cvYAdB?p=preview

直接组件示例是实现我的目标的清晰方法,但我不想列出每个组件,因为组件相互嵌套。例如:

<c-nested-input input-bindings="$ctrl.input.inputBindings"/>

比输入这个要容易得多

<c-direct-input input-placeholder="{{$ctrl.inputPlaceholder}}" input-type="{{$ctrl.inputType}}" input-model="$ctrl.inputModel"/>\

每次我想将输入组件嵌套在父组件中。

希望此更新能够进一步澄清我正在寻找的内容。

最佳答案

有几个问题导致您的示例不起作用:

第一个问题:不可转让的属性(property)

您遇到“不可分配”的问题。当您声明<c-nested-input input-bindings="{type: 'text', model: 'data.comment', placeholder: 'nested component'}"></c-nested-input>时,您创建一个不可分配属性 {type: 'text', model: 'data.comment', placeholder: 'nested component'} (顺便说一句,您在 'data.comment' 上犯了一个错误,应该是 data.comment )。当您尝试在 ngModel 中为其分配值时,它将失败,因为您无法影响不可分配的表达式,甚至无法影响不可分配的表达式属性

所以解决方案是在主 Controller 中设置一个可分配的对象 inputBindings 并将其传递给您的组件。

第二期data.comment引用

这还不是全部。如果你尝试:

  $scope.data = {}
$scope.inputBindings = {
type: 'text',
model: $scope.data.comment,
placeholder: 'nested component'
}

并将其传递给您的嵌套组件:

<c-nested-input input-bindings="inputBindings"></c-nested-input>

它不会按你想要的方式工作。因为当您的嵌套将修改 inputBindings.model 时,它不会是与 data.comment 相同的引用。 = Binding 代表 inputBindings 而不是它的属性。

没有办法避免这种情况。

所以你必须删除你的 data.comment 并按如下方式工作:

标记:

<body ng-controller="MainCtrl">
<h1> Data Comment => {{ inputBindings.model }} </h1>
<hr/>
<c-direct-input plplaceholder="direct component" plmodel="inputBindings.model" pltype="text"></c-direct-input>
<c-nested-input input-bindings="inputBindings"></c-nested-input>
</body>

JS:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
$scope.inputBindings = {
type: 'text',
placeholder: 'nested component'
}
});

app.component('cNestedInput', {
template: '\
<h2> Nested Component </h2>\
<p style="display: block;"> {{ $ctrl.data.comment }} </p>\
<input type="{{ $ctrl.inputBindings.type }}" placeholder="{{ $ctrl.inputBindings.placeholder}}" ng-model="$ctrl.inputBindings.model" />\
',
bindings: {
inputBindings: '='
},
controller: function() {}
});

app.component('cDirectInput', {
template: '\
<h2> Direct Component </h2>\
<p style="display: block;"> {{ $ctrl.plmodel }} </p>\
<input type="{{ $ctrl.pltype }}" placeholder="{{ $ctrl.plplaceholder }}" ng-model="$ctrl.plmodel" />\
',
bindings: {
plplaceholder: '@',
plmodel: '=',
pltype: '@'
},
controller: function() {

}
});

plunker中的示例.

我的建议

我认为创建组件的更简洁的方法是混合方法:

类似于:

JS:

app.component('cHybridInput', {
template: '\
<h2> Nested Component </h2>\
<p style="display: block;"> {{ $ctrl.data.comment }} </p>\
<input type="{{ $ctrl.options.type }}" placeholder="{{ $ctrl.options.placeholder}}" ng-model="$ctrl.ngModel" />\
',
bindings: {
ngModel: '=',
options: '<'
},
controller: function() {}
});

HTML:

<c-hybrid-input ng-model="inputBindings.model" options="inputBindings"></c-hybrid-input>

关于javascript - 为什么这些 AngularJS 组件之一成功显示了 ng-model 的值,而另一个却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43376629/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com