如何在ng-repeat内部选择更新模型?

时间:2015-03-19 18:36:03

标签: angularjs

子范围内的窗口小部件,带有ng-repeated div和选择下拉列表:

<div ng-repeat="term in ticker.terms">
    <select ng-model="term.chosenTag" ng-change="ticker.changeTag(term)">
        <option>...</option>
        <option>...</option>
        <option>...</option>

我试图从父作用域更改^ term.chosenTag term是重复的数据对象(term in terms


完整代码Gists:
主要父母HTML:
https://gist.github.com/leongaban/e0154005bed6b6892df7

Ticker Child HTML
https://gist.github.com/leongaban/9a5fd86643051fd9e1af

TickerController(Child)
https://gist.github.com/leongaban/2d58174cfe6e5c9c0465

MainController(Parent)
https://gist.github.com/leongaban/1563b09b906337a3e6ad

TagFactory
https://gist.github.com/leongaban/8db5027e1cb86f614fa5


现在,父范围中的select也需要控制子选择中的模型:

<select ng-model="main.selected_tag"
        ng-change="main.changeTag(main.the_tag)">

main.changeTag函数调用它:

vm.changeTag = function(term) {

    // Update tag in model:
    TagFactory.updateTag(term);
};

然后TagFactory更新数据库中的术语以及我的模型:

// Update tag:
tags.updateTag = function(data) {
    var tag = data;

    // Filter and find tag by id:
    var tagObj = {};
    tagObj = $filter('filter')(tags, { term_id: tag.term_id })[0];

    // Update tag in model:
    tagObj.tag = tag.chosenTag;

    /**
    * PUT : update tag on DB
    */
    ApiFactory.updateTag(
        tag.term_id,
        tag.chosenTag,
        tag.ticker).then(function(data) {
            console.log('PUT:');
            console.log(data);
    });

    return tag;
};

1 个答案:

答案 0 :(得分:1)

由于你启动了updateTag调用onchange,而不是onclick,我将假设不断更新服务的数据是正常的。另一种不建议的方法是,如果您只想在特定时间将数据推送到服务,以避免所有模板在您仍需要执行AJAX时立即查看工厂数据的更改。 / p>

在适当的控制器中,注入TagFactory,创建对工厂数据的引用:

$scope.tags = TagFactory.tags;

然后您的HTML可以直接修改TagFactory本身:

<div ng-repeat="tag in /*expression that determines ticker.terms with respect to $scope.tags*/">
    <select ng-model="tag.chosenTag">

表达式可以像&#34; tags&#34;一样简单,但它可能需要涉及一个只返回ticker.terms标签的过滤器。