如何使用来自不同控制器的选项在 Angular 中的 <select> 标签中预先设置 select 选项?
How to pre-select option from <select> tag in Angular with options from a different controller?
我在这里使用两个控制器。一,productComponentsController
,处理对我们数据库的调用,该调用返回一个 productComponent
对象数组。另一个 AddEditArticleController
控制 'Create New / Edit Existing Article' 页面。
在我的 Add/Edit 文章页面上,我希望 <select>
填充 productComponents
,并且,如果我正在编辑现有文章,则需要 select 编辑了该文章的当前 productComponent
。
虽然这看起来很简单,但我无法使用现有的 productComponent
使字段成为 select 之前的字段,尽管它确实用它们正确地填充了 <select>
。我已经尝试过 ngRepeat 和 ngOptions,它们都可以用于填充下拉列表,但都不能用于预先 selecting 现有的 productComponentID
来自服务器返回的数组。
我的 HTML,使用 ngOptions:
<!-- productComponentsController as pvm, AddEditArticleController as vm -->
<select id="componentBox"
ng-model="vm.selectedComponent"
placeholder="Select a Product Component"
ng-change="vm.changeProductID()"
class="form-control input-md"
ng-options="component.name for component in pvm.productComponents track by component.id"></select>
我的 HTML,使用 ngRepeat:
<!-- productComponentsController as pvm, AddEditArticleController as vm -->
<select id="componentBox"
ng-model="vm.selectedComponent"
placeholder="Select a Product Component"
ng-change="vm.changeProductID()"
class="form-control input-md">
<option value="{{component.id}}"
ng-repeat="component in pvm.productComponents"
ng-selected="vm.selectOption(component.id)"
ng-bind-html="component.name"></option>
</select>
<!-- vm.selectOption() returns true if the current option's ID equals the productComponentID of the current Article. Therefore this option would be selected. -->
在我的 AddEditArticleController
中,我将 vm.selectedComponent 设置为等于数据库返回的文章的 productComponentID
,在我调用的 promise.then() 中.虽然 vm.selectedComponent
确实发生了变化,但这对下拉菜单没有任何影响。
此外,在我生成的 HTML 中,我得到选项:<option value="? number:47 ?"></option>
(对于 productComponentID = 47 的文章)。显然,这是由于将模型设置为未知值而发生的,但我不知道为什么将模型设置为整数 id 以外的任何值。
这是因为我的 select 正在访问多个控制器,还是我在这里遗漏了一些明显的东西?非常感谢任何帮助,如果需要更多信息,请告诉我。
我相信您正在寻找 ng-init...
<!-- productComponentsController as pvm, AddEditArticleController as vm -->
<select id="componentBox"
class="form-control input-md"
placeholder="Select a Product Component"
ng-change="vm.changeProductID()"
ng-model="vm.selectedComponent"
ng-init="vm.selectedComponent=productComponentID"
ng-options="component as component.name for component in pvm.productComponents track by component.id"></select>
所以事实证明,因为模型必须是一个字符串,所以我必须在 vm.selectedOption
发生变化时将其转换为一个字符串(在本例中,在 vm.selectOption
函数中)使用String()
。这是使用 ngRepeat。 ngInit 似乎与我的代码如何工作无关。
砰,就是这样,我的代码有效。
我在这里使用两个控制器。一,productComponentsController
,处理对我们数据库的调用,该调用返回一个 productComponent
对象数组。另一个 AddEditArticleController
控制 'Create New / Edit Existing Article' 页面。
在我的 Add/Edit 文章页面上,我希望 <select>
填充 productComponents
,并且,如果我正在编辑现有文章,则需要 select 编辑了该文章的当前 productComponent
。
虽然这看起来很简单,但我无法使用现有的 productComponent
使字段成为 select 之前的字段,尽管它确实用它们正确地填充了 <select>
。我已经尝试过 ngRepeat 和 ngOptions,它们都可以用于填充下拉列表,但都不能用于预先 selecting 现有的 productComponentID
来自服务器返回的数组。
我的 HTML,使用 ngOptions:
<!-- productComponentsController as pvm, AddEditArticleController as vm -->
<select id="componentBox"
ng-model="vm.selectedComponent"
placeholder="Select a Product Component"
ng-change="vm.changeProductID()"
class="form-control input-md"
ng-options="component.name for component in pvm.productComponents track by component.id"></select>
我的 HTML,使用 ngRepeat:
<!-- productComponentsController as pvm, AddEditArticleController as vm -->
<select id="componentBox"
ng-model="vm.selectedComponent"
placeholder="Select a Product Component"
ng-change="vm.changeProductID()"
class="form-control input-md">
<option value="{{component.id}}"
ng-repeat="component in pvm.productComponents"
ng-selected="vm.selectOption(component.id)"
ng-bind-html="component.name"></option>
</select>
<!-- vm.selectOption() returns true if the current option's ID equals the productComponentID of the current Article. Therefore this option would be selected. -->
在我的 AddEditArticleController
中,我将 vm.selectedComponent 设置为等于数据库返回的文章的 productComponentID
,在我调用的 promise.then() 中.虽然 vm.selectedComponent
确实发生了变化,但这对下拉菜单没有任何影响。
此外,在我生成的 HTML 中,我得到选项:<option value="? number:47 ?"></option>
(对于 productComponentID = 47 的文章)。显然,这是由于将模型设置为未知值而发生的,但我不知道为什么将模型设置为整数 id 以外的任何值。
这是因为我的 select 正在访问多个控制器,还是我在这里遗漏了一些明显的东西?非常感谢任何帮助,如果需要更多信息,请告诉我。
我相信您正在寻找 ng-init...
<!-- productComponentsController as pvm, AddEditArticleController as vm -->
<select id="componentBox"
class="form-control input-md"
placeholder="Select a Product Component"
ng-change="vm.changeProductID()"
ng-model="vm.selectedComponent"
ng-init="vm.selectedComponent=productComponentID"
ng-options="component as component.name for component in pvm.productComponents track by component.id"></select>
所以事实证明,因为模型必须是一个字符串,所以我必须在 vm.selectedOption
发生变化时将其转换为一个字符串(在本例中,在 vm.selectOption
函数中)使用String()
。这是使用 ngRepeat。 ngInit 似乎与我的代码如何工作无关。
砰,就是这样,我的代码有效。