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")
      }
    });
}
War es hilfreich?

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);
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top