ngOptions не обновляется по мере добавления объектов в массив

StackOverflow https://stackoverflow.com//questions/22029690

Вопрос

У меня есть массив, содержащий объекты.Когда я добавляю новый объект в этот список, представление не обновляется для добавления нового объекта.Я предполагаю, что это связано с $scope.$apply, но я не уверен, как его использовать.Я попытался обернуть это функцией push, но фабрика говорит, что $scope не определена.

Вид:

        <label for="groupOwner">List Template:
            <select 
                id="listTemplate"
                ng-model="newList.template"
                ng-options="t.name for t in listTemplates|orderBy: 'name'"
            ></select>
        </label>

Ctrl:

    $scope.createList = function (){
        var modalForm = '/Style%20Library/projects/spDash/app/partials/newList.html';   
        var modalInstance = $modal.open({
            templateUrl: modalForm,
            backdrop: true,
            windowClass: 'modal',
            controller: 'newListCtrl',
            resolve: {
                newListData: function (){
                    return $scope.newList;
                }
            }
        });

        modalInstance.result.then(function(newList){
            SiteService.createList(newList,$scope.site);
        });
    };

Сервисная функция:

var createList = function (newList, site){
    var promise = $().SPServices({
        operation: "AddList",
        webURL: site.url,
        listName: newList.name,
        description: newList.description,
        templateID: newList.template.id
    })

    promise.then(function (){
        addToQuickLaunch(newList.name,site.url)
        getSiteInfo(site);
        //take new list object and push to siteLists array
        siteLists.push(newList);
    },function (reason){
        console.log('Failed: ' + reason);
    })
}  

function addToQuickLaunch (name,siteUrl) {
    $().SPServices({
      operation: "UpdateList",
      webURL: siteUrl,
      listName: name,
      listProperties: "<List OnQuickLaunch='TRUE' EnableVersioning='TRUE'/>",
      completefunc: function(xData,Status){
        console.log(name + " list created")
      }
    });
}
Это было полезно?

Решение

Этот код немедленно выдает мне флаг:

modalInstance.result.then(function(newList){
    SiteService.createList(newList,$scope.site);
});

Не следует таким образом передавать массив из контроллера через сервис.Вместо этого сделайте следующее:

modalInstance.result.then(function(newList){
    return SiteService.createList(newList);
}).then(function(list) {
  $scope.site.lists.push(list);
});

В этом случае у вас будет createList вернуть обещание и разрешить это обещание с помощью объекта, который должен быть добавлен в $scope.site.lists.Однако следует отметить, что в вашем контроллере не должно быть такого большого количества логики.Еще больше абстрагируйте это, создав один метод, который возвращает обещание и скрывает эти детали.Ваш контроллер должен просто иметь:

someService.someMethod().then(function(result) {
  $scope.whatever.push(result);
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top