2014-11-16 3 views
0

Я изучаю события в инфраструктуре Enyo js и не могу понять, почему я получаю ошибку, и событие onModelChanged не обрабатывается. Сообщение об ошибке является "Uncaught TypeError: не определено не является функцией"Нестандартное событие Enyo не обрабатывается и не определено в простом примере

Код:

debugger; 
enyo.kind({ 
    name : "MyModel", 
    kind: "enyo.Model", 
    defaultSource: "mocked", 
    published: { 
     title : "not set", 
     text : "not set",  
    }, 

    events : { 
     onModelChanged : "", 
    }, 

    handlers: { 
     onModelChanged : "modelLoadedHandler" 
    }, 

    modelLoadedHandler : function(inSender, inEvent){ 
     debugger; 
     console.log("handler in model"); 
     console.log(inEvent.textMsg); 
     return true; 
    }, 

    fetch : function(opts){ 
     this.inherited(arguments); 
     debugger; 
     this.doModelChanged({textMsg: "fire event"}); // Uncaught TypeError: undefined is not a function 

    }  

}); 



var model = new MyModel(); 
model.fetch(); 

P.S. Оставьте этот код в качестве ответа не будет удалено jsfiddle

enyo.kind({ 
    name: "MyMockSource", 
    kind: "enyo.Source", 
    fetch: function(model, opts) { 
     if(model instanceof enyo.Model) { 
      opts.success({title: "testing", text: "Some stuff"}); 
     } else { 
      throw new Error("Model mock only"); 
     } 
    } 
}); 

new MyMockSource({name: "mocked"}); 

enyo.kind({ 
    name : "MyModel", 
    kind: "enyo.Model", 
    source: "mocked", 
    attributes: { 
     title : "not set", 
     text : "not set",  
    }, 
    fetched: function(opts){ 
     this.inherited(arguments); 
     enyo.log("fetched"); 
     // Do something here if you need to, otherwise you might want to overload 
     // the parse method and set parse: true to modify the retrieved data 
    }, 
    titleChanged: function(was, is) { 
     enyo.log("Title is now: " + is); 
    } 
}); 

enyo.kind({ 
    name: "MyView", 
    components: [ 
     {kind: "Button", content: "Fetch", ontap: "fetch"}, 
     {name: "title"}, 
     {name: "text"} 
    ], 
    bindings: [ 
     {from: "model.title", to: "$.title.content"}, 
     {from: "model.text", to: "$.text.content"} 
    ], 
    fetch: function() { 
     this.set("model", new MyModel()); // Probably want to create model elsewhere 
     this.model.on("change", enyo.bindSafely(this, "modelChanged")); 
     this.model.fetch(); 
    }, 
    modelChanged: function() { 
     this.log("Something happened to my model!"); 
    } 
}); 

new enyo.Application({ name: "app", view: "MyView" }); 

ответ

1

enyo.Model не является enyo.Object (а тем более enyo.Component). Он не поддерживает опубликованные свойства или события. Вы хотите определить attributes для модели. Вы все равно можете получать уведомления об изменениях свойств, используя событие propertyChanged, или используя observers.

Кроме того, вы, вероятно, захотите перегрузить fetched, если хотите знать, что выборка завершена. fetch может вернуться до того, как данные были извлечены.

Если вы хотите подписаться на события из-за пределов, то вы, вероятно, хотите, чтобы привязать к конкретной собственности на модели или к changed события с помощью model.on('change') (обратите внимание, что это другая система событий из системы events: [] используется в другом месте.

Update: Вот скрипка, показывающая различные способы работы с моделью и связыванием с данными

http://jsfiddle.net/RoySutton/5jo0p7ar/

+0

к сожалению, я новичок в JS и UI и не расслышал, что вы имеете в виду о внешних событиях. Но как исправить этот код, чтобы сделать i я работаю так, как я ожидаю? –

+2

Я имел в виду, что если вы хотите поймать события из модели с объекта, который не был самой моделью. Добавлена ​​рабочая скрипка. – Pre101

1

Когда вы используете систему событий таким образом, вы, как правило, ожидаете компоненту выше цепей для обработки onModelChanged события, а не компонент, который определяет событие. Кроме того, enyo.Model - это особый случай, и я полагаю, что использует другой механизм наблюдения. Вероятно, именно поэтому вы получаете «undefined» для вызова функции, потому что нет никакого магического отображения между методом onModelChanged и doModelChanged.