ngOptions werden nicht aktualisiert, wenn Objekte zum Array hinzugefügt werden
-
21-12-2019 - |
Frage
Ich habe ein Array, das Objekte enthält.Wenn ich ein neues Objekt in diese Liste schiebe, wird die Ansicht nicht aktualisiert, um das neue Objekt hinzuzufügen.Ich gehe davon aus, dass es mit $scope.$apply zu tun hat, bin mir aber nicht sicher, wie ich es verwenden soll.Ich habe versucht, die Push-Funktion darum zu wickeln, aber die Fabrik sagt, dass $scope undefiniert ist.
Sicht:
<label for="groupOwner">List Template:
<select
id="listTemplate"
ng-model="newList.template"
ng-options="t.name for t in listTemplates|orderBy: 'name'"
></select>
</label>
Strg:
$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);
});
};
Servicefunktion:
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")
}
});
}
Lösung
Dieser Code löst bei mir sofort eine Warnung aus:
modalInstance.result.then(function(newList){
SiteService.createList(newList,$scope.site);
});
Sie sollten das Array nicht auf diese Weise vom Controller durch den Dienst leiten.Gehen Sie stattdessen folgendermaßen vor:
modalInstance.result.then(function(newList){
return SiteService.createList(newList);
}).then(function(list) {
$scope.site.lists.push(list);
});
In diesem Fall haben Sie createList
Geben Sie ein Versprechen zurück und lösen Sie dieses Versprechen mit dem Objekt auf, dem hinzugefügt werden soll $scope.site.lists
.Allerdings sollten Sie beachten, dass Ihr Controller nicht über so viel Logik verfügen sollte.Abstrahieren Sie dies weiter, indem Sie eine einzige Methode verwenden, die ein Versprechen zurückgibt, und diese Details ausblenden.Ihr Controller sollte einfach Folgendes haben:
someService.someMethod().then(function(result) {
$scope.whatever.push(result);
});