2016-07-22 4 views
0

Ich habe eine einfache Nativescript App.Nativescript - gebundene Eigenschaft in der Ansicht wird nicht aktualisiert, wenn das Modell in promise.then() eingestellt ist

Wenn ich model.path Eigenschaft aktualisieren, wird es korrekt festgelegt und Label in UI zeigt seinen Wert.

Aber wenn ich die model.path Eigenschaft im .then eingestellt (...) Funktion zurück Versprechen (neue Promise (...)) die Eigenschaft festgelegt ist (Alarm in upload (...) Methode zeigt einen richtigen Wert), aber Label in UI wird nicht mehr aktualisiert. Warum?

Haupt page.xml:

<Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="pageLoaded"> 
    <StackLayout> 
     <Button width="200" height="66" text="Record!" tap="recordVideo"></Button> 
     <Label text="{{path}}"></Label> 
    </StackLayout> 
</Page> 

Haupt-Seite-model.ts:

import { Observable } from 'data/observable'; 

export class MainPageModel extends Observable { 
    private _path: string; 

    constructor() { 
     super(); 
    } 

    public get path(): string { 
     return this._path; 
    } 

    public set path(value: string) { 
     this._path = value; 
     super.notify({ object: this, eventName: Observable.propertyChangeEvent, propertyName: "path", value: this._path }); 
    } 
} 

Haupt page.ts:

import { VideoRecorder } from 'nativescript-videorecorder'; 
import { MainPageModel } from './main-page-model'; 
import { EventData } from "data/observable"; 
import { Page } from "ui/page"; 

var model: MainPageModel; 

export function pageLoaded(args: EventData) { 
    let page = <Page>args.object; 
    model = new MainPageModel(); 
    page.bindingContext = model; 
} 

export function recordVideo() { 
    model.set("path", "clieckedd"); 
    let videorecorder = new VideoRecorder(); 
    let options = { 
     saveToGallery: true, //default false | optional 
     duration: 10, //(seconds) default no limit | optional 
     size: 10, //(MB) default none | optional #android 
     hd: false, //default false low res | optional 
     explanation: "Why do i need this permission" //optional on api 23 #android 
    }; 

    videorecorder.record(options) 
    .then((data) => { 
     model.set("path", data.file); 
     uploadFile(model); 
    }) 
    .catch((err) => { 
     console.log(err); 
     model.path = err; 
    }); 
} 

function uploadFile(model: MainPageModel) { 
    alert(model.path); 
} 

exports.model = model; 

Danke

+0

Ich habe das gleiche Problem in einem anderen Anwendungsfall: 'status = new BehaviorSubject (" "); channel.subscribe (m => this.onMessage) '. onMessage aktualisiert den Status mit 'status.next (" bla ")' die Eigenschaft wird korrekt aktualisiert, aber keine Statusänderung util ich klicke auf eine Schaltfläche, die das Update auslöst. Ich benutze eckig, ich bin mir nicht sicher, was passiert, die Dokumentation sagt nichts. –

Antwort

0

Ich denke, das liegt daran, dass Sie dieverwendet habenMethode von Observable, die model.set("path", data.file); ist, anstelle von Ihrer public set path(value: string). Deshalb wird die super.notify nicht aufgerufen, daher wird die Label-UI nicht auf den neuen Wert aktualisiert. Ich denke, es sollte model.path(data.file) sein

+0

'model.path (data.file)' kann nicht verwendet werden, es ist eine Eigenschaft, keine Methode. Aber zu Ihrer Antwort habe ich zuerst 'model.path = data.file;' verwendet, aber es funktionierte auch nicht. Und als jemand mir schrieb, sollte ich 'model.set ('path', data.file);' stattdessen verwenden, was auch nicht half. –

+0

Nun, mach es zu einer Methode, dann: 'public setPath (value: string) {}'. Und setzen Sie die Benachrichtigung natürlich nach innen –

Verwandte Themen